首页 > 试题广场 >

买橘子

[编程题]买橘子
  • 热度指数:11561 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}小明去附近的水果店买橙子。水果商贩只提供整袋购买,有每袋 6 个和每袋 8 个的包装(包装不可拆分)。可是小明只想购买恰好 n 个橙子,并且尽量少的袋数方便携带,请你帮他计算一下最少需要购买的袋数。如果不能购买恰好 n 个橙子,小明将不会购买,此时输出 -1

输入描述:
\hspace{15pt}在一行上输入一个整数 n \left(1 \leqq n \leqq 10^5\right),表示小明想要购买的橙子数量。


输出描述:
\hspace{15pt}如果不能通过购买整袋橙子凑出 n 个橙子,则输出 -1;否则,输出一个整数表示最少需要购买的袋数。
示例1

输入

20

输出

3
示例2

输入

7

输出

-1

备注:
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-06-25 优化题面文本与格式,修正为单组输入。
2. 2025-08-07 优化题面文本与格式,扩大数据范围。
3. 2025-11-19 优化题面文本与格式;补充一组样例。新增若干组测试数据。
import sys
n=int(sys.stdin.readline())
a=int(n/8)+1
res=[]
for i in range(a):
    if (n-8*i)%6==0:
        res.append(int(i+(n-8*i)/6))
if len(res)==0:
    print(-1)
else:
    res=sorted(res)
    print(res[0])
发表于 2019-03-19 20:22:54 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 目标橙子数量

        // 标签用于找到结果后直接结束
        res: {
            // 全用8个装的情况
            if (n % 8 == 0) {
                System.out.println(n / 8);
                break res;
            }

            // 从多到少尝试8个装的袋数
            for (int e = n / 8; e >= 0; e--) {
                int left = n - e * 8; // 剩余橙子数

                // 剩余数量能被6整除
                if (left >= 0 && left % 6 == 0) {
                    System.out.println(e + left / 6); // 总袋数
                    break res;
                }
            }

            // 无法恰好购买
            System.out.println(-1);
        }
        sc.close();
    }
}

发表于 2025-08-26 19:51:19 回复(0)

其他语言永远也体会不到C语言的快乐(尤其是C++)
#include <stdio.h>

int main()
{
	int n,i;
	scanf("%d",&n);
	if(n<6 || n&1 || n==10)
	{
		puts("-1");
		return 0;
	}
	n >>= 1;
	for(i=(n>>2);i>EOF;i--)
		if((n-(i<<2))%3==0)
		{
			printf("%d\n",i+(n-(i<<2))/3);
			return 0;
		}
}

发表于 2019-08-20 16:19:50 回复(1)
#include <bits/stdc++.h> 
	
using namespace std;
int main () { int n; cin >> n; for (int i=0; i<=17; ++i) { for (int j=0; j<=13; ++j) { if (6 * i + 8 * j == n) { cout << i + j << endl; return 0; } } } cout << -1 << endl; return 0;
}



这题其实是我在给另一道题打表的时候顺便水过去的,因为这题确实很水。
首先算出100/6的值向上取整是17, 100/8向上取整的值13,再看一下这题数据范围,惊奇的发现只有100.
那就意味着O(n2)可以过!
那么我们只要选择暴力枚举就好了。于是就有了上面的两重循环
编辑于 2019-02-07 17:31:32 回复(1)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;
    cout<<((n<6||n%2!=0||n==10)?-1:(n+6)/8)<<endl;
    return 0;
}

发表于 2025-11-10 23:42:13 回复(0)
线性规划,6x+8y=n(x>0,y>0,x,y为整数)的条件下,求ans = x+y的最小值;
思路:易知x=0时ans最小,此时不一定满足ans为整数,所以我们用x表示ans,从0开始枚举x,若ans为整数直接返回即可(也可以从大到小枚举y)

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n;
    cin>>n;
    if(n%2==1){
        cout<<-1;
        return 0;
    };
    double ans;
    for(int x=0;x<18;x++){
        ans = 1.0*(n/2+x)/4.0;
        if(fabs(ans - int(ans)) < 1e-9){
            cout<<int(ans);
            return 0;
        }
    }
    cout<<-1;
    return 0;
}

发表于 2025-07-31 12:03:03 回复(1)
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        flag:{if(n%8==0){
            System.out.println(n/8);
        }else{
            for(int i=n/8;i>=0;i--){
                int x=n-i*8;
                if(x>=6&&x%6==0){
                    System.out.println(i+x/6);
                    break flag;
                }
            }
            System.out.println(-1);
        }
             }
    }
}

发表于 2019-04-01 07:49:40 回复(0)
import sys
n=int(sys.stdin.readline().strip())
# 6个的有x袋,8个的有y袋
# x属于[0,16]
# y属于[0,12]
# 遍历所有可能
results=[]
for x in range(17):
    for y in range(13):
        if 6*x+8*y==n:
            result=x+y
            results.append(result)
if len(results)==0:
    print(-1)
else:
    print(min(results))

发表于 2019-03-31 20:09:13 回复(2)
暴力枚举就好,给的范围比较宽,数也比较小,所以直接循环得所有情况一一检验就好
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n%2!=0||n<6)
        cout<<-1;
    else{
        int min=100;
        for(int i=0;i<13;i++){
            for(int j=0;j<17;j++){
                if(8*i+6*j==n)
                    min=i+j;
            }
        }
        cout<<min<<endl;
    }
}

发表于 2019-02-16 20:33:03 回复(0)
import java.util.*;

public class Main {
    public static final int MAX = 105;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] bags = {6, 8};
        int[] dp = new int[MAX];
        for (int i=0; i!=bags.length; i++) {
            dp[bags[i]] = 1;
        }
        Arrays.fill(dp, -1);
        dp[0] = 0;
        for (int i=1; i<=n; i++) {
            for (int j=0; j<bags.length; j++) {
                if (i - bags[j] >= 0 && dp[i - bags[j]] > -1) {
                    if (dp[i] == -1 ) {
                        dp[i] = dp[i - bags[j]] + 1;
                    }else {
                        dp[i] = Math.min(dp[i], dp[i - bags[j]] + 1 );
                    }
                }
            }
        }
        System.out.println(dp[n]);
        return;
    }
}
发表于 2019-01-27 19:07:43 回复(0)
include <stdio.h>
int main() {
    int a;
    scanf("%d",&a);
    int i,j;
    int ret=0;
    for(i=0;i<=20000;i++){
        for(j=0;j<=20000;j++){
            if(a==6*i+8*j){
                printf("%d",i+j);
                ret=1;
                goto end;  
            }
        }
    }
    end:
    if(ret==0){
        printf("-1");
    }
    return 0;
}
有没有什么方法可以当6*i+8*j>a时,就不再循环
发表于 2025-12-14 20:41:34 回复(0)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ans = Integer.MAX_VALUE;
        boolean flag = false;
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= n; j++) {
                if (6 * i + 8 * j == n) {
                    ans = Math.min(ans, i + j);
                    flag = true;
                }
            }
        }
        if (flag) {
            System.out.println(ans);
        } else {
            System.out.println(-1);
        }
    }
}

发表于 2025-11-15 01:35:28 回复(0)
#include <iostream>

int main()
{
    std::cin.tie(0)->sync_with_stdio(0);
    int num;
    std::cin >> num;

    if (num < 6 || num % 2 != 0)
    {
        std::cout << -1;
        return 0;
    }

    int eigMax = num / 8;
    for (int i = eigMax; i >= 0; --i)
    {
        int count = num - 8 * i;
        if (count % 6 == 0)
        {
            int x = count / 6;
            std::cout << x + i;
            return 0;
        }
    }
}

发表于 2025-11-07 00:06:07 回复(0)
贪心算法
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
   
    if (n < 6 || n % 2 != 0)            //袋数小于6或者不是2的倍数(6,8都是2的倍数)
    {
        printf("-1\n");
        return 0;
    }

    int max_8 = n / 8;      //先计算都装8袋最多能装多少
    int min_bags = -1;

    for (int k = max_8; k >= 0; k--) //贪心算法,一袋一袋减少,看是否能与6整除
    {
        int remaining = n - 8 * k;
        if (remaining % 6 == 0)
        {
            min_bags = k + (remaining / 6);     //能整除,则加上最多装8袋的次数
            break;
        }
    }

    printf("%d\n", min_bags);
    return 0;
}
发表于 2025-10-17 20:20:17 回复(0)
#include <stdio.h>

int main ()
{
int n=0;
scanf("%d",&n);
if(n%2==1 || n<6)
 printf("%d",-1);
 else if(n%8==0)
  printf("%d",n/8);
  else
  printf("%d",n/8+1);
return 0;
}
这就是C语言的简洁吗!!!!!!
发表于 2025-10-05 19:48:07 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
     System.out.println(minBags(sc.nextInt()));
    }
    public static int minBags(int n ){
        int Max = Integer.MAX_VALUE;
        for( int y=0 ; y<=n/8 ;y++)
        {
           int modile = n-8*y;
           if(modile>=0&&modile%6==0){
            int x =modile/6;
            Max=Math.min(Max,x+y);
            }
        }
        return Max == Integer.MAX_VALUE ? -1:Max;
    }
}//
发表于 2025-09-04 11:39:00 回复(0)
n = int(input())
flag = False
for num_8 in range(n//8,-1,-1):
    if (n-8*num_8)%6==0:
        print(num_8+(n-8*num_8)//6)
        flag = True
        break
if not flag:
    print(-1)
发表于 2025-08-24 15:55:43 回复(0)
import sys

n = int(sys.stdin.read())
i = n//8
count = 0

if n%8 == 0:
    print(n/8)
else:
    while i>=0:
        if (n-i*8)%6 == 0:
            print(i+(n-i*8)//6)
            count += 1
            break
        else:
            i -= 1
if count == 0:
    print("-1")
发表于 2025-08-23 21:34:22 回复(0)
n = int(input())
cnt = -1
for i in range(n//6+1):
    left = n - 6*i
    if left % 8 == 0:
        cnt = i+left//8
        break
    else:
        continue

print(cnt)

发表于 2025-08-02 17:18:16 回复(0)
import sys

for line in sys.stdin:
    a =int(line.strip())
def getNum(a):
    mod_6=a%6
    div6=a//6
    
    if mod_6 not in (0,2,4,6):
        return -1
    else:
        num8=mod_6//2
        div6=div6-num8
        div6=div6-div6//4
    return div6+num8
print(getNum(a))
 先按照全部装6个计算,算出6个的袋数和余数;
看余数是否能被2整除,如果能被2整除就分配到6个的袋子里面(余数除与2就是8个的袋数);
4个6个的袋子能用3个8个的袋子替换(将6个的袋数除与4得出能减少的袋数)。
发表于 2025-08-01 20:25:43 回复(0)

问题信息

上传者:小小
难度:
50条回答 5365浏览

热门推荐

通过挑战的用户

查看代码
买橘子