首页 > 试题广场 >

买橘子

[编程题]买橘子
  • 热度指数:12615 时间限制: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)
n = int(input())
d = n//8+1
while d>=0:
    temp = n - d*8
    if temp < 0:
        d-=1
        continue
    else:
        if temp%6==0:
            break
    d-=1
if d==-1:
    print(-1)
else:
    print(d+(n-d*8)//6)
发表于 2026-01-12 20:26:13 回复(0)
deep seek老师说这是贪心
#include <stdio.h>

int main() {
    int n,yl,ds,key=0;
    scanf("%d",&n);
    yl=n%8;
    ds=n/8;
    if(yl==2&&ds>=2&&key==0){
        ds+=1;//两袋8加上余下的2,换成了3袋6
        printf("%d",ds);
        key+=1;
    }
    if(yl==4&&ds>=1&&key==0){
        ds+=1;//一袋子8加上yl,换成了2袋子2
        printf("%d",ds);
        key+=1;
    }
    if(yl==6&&key==0){
        ds+=1;
        printf("%d",ds);
        key+=1;
    }
    if(yl==0&&key==0){
        printf("%d",ds);
        key+=1;
    }
    if(yl%2==1&&key==0){
        printf("-1");
        key+=1;
    }
    if(key==0){
        printf("-1");
    }
    return 0;
}
发表于 2026-01-07 01:56:25 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        /**
         * 购买n橙子,有每袋6个,每袋8个,求最少购买多少袋能正好买n个橙子
         */
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int minBags = Integer.MAX_VALUE;
        boolean found = false;
        for (int i = 0; i <= n / 6; i++) {
            for (int j = 0; j <= n / 8; j++) {
                if (i * 6 + j * 8 == n) {
                    found = true;
                    minBags = Math.min(minBags, i + j);
                }
            }
        }
        if (found) {
            System.out.println(minBags);
        } else {
            System.out.println(-1);
        }
    }
}
发表于 2026-01-03 19:39:59 回复(0)
#include<stdio.h>
int main(){
   int n;
    scanf("%d",&n);
    if(n%2!=0){
        printf("-1\n");
     return 0;
    }
    int min_bags=-1;
    for(int six=0;six<=n/6;six++){
     int rem=n-six*6;
        if(rem>=0&&rem%8==0){
            int eight=rem/8;
            int total=six+eight;
        }if(min_bags==-1||total<=minbags){
          min_bags=total;
        }
    }
printf("%d\n",min_bags);
return 0;
}

发表于 2025-12-27 12:18:49 回复(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)

问题信息

上传者:小小
难度:
54条回答 5591浏览

热门推荐

通过挑战的用户

查看代码
买橘子