首页 > 试题广场 >

买橘子

[编程题]买橘子
  • 热度指数:15812 时间限制: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)
import sys

n, t = int(sys.stdin.readline()), -1
for i in range(n // 6 + 1):
    k = n - 6 * i
    if k % 8 == 0:
        t = i + k // 8
        break
print(t)

发表于 2026-01-18 13:55:39 回复(0)
#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)
原本的排序题可以简化成比大小问题
import sys
n=int(input())
sum=n
for i in range(n//6+1):
    j=n-i*6
    if j%8==0:
        sum=min(sum,i+int(j/8))
if sum==n:
    print(-1)
else:
    print(sum)
发表于 2026-02-28 17:31:35 回复(0)
# 基础数学题就该直接计算解答
import sys
for line in sys.stdin:
    data = line.split()
    n = int(data[0])
   
    # 排除奇数
    if n%2 == 1:
        print(-1)
        break
   
    # 如果是8的倍数直接输出
    if n%8 == 0:
        print(n//8)
        break
   
    # 假设全部买8个的直至超过需求,此时买了 n//8+1 袋,总量 m = (n//8+1)*8
    # m与n的差为2的倍数,每将一袋8个装换成6个装,m就会减少2,直至m=n,因此 n//8+1 袋可以满足需求
    # 如果购买的 n//8+1 过少,无法满足"8换6"袋数的需求,则无解,输出-1
    if (n//8 + 1) < (((n//8+1)*8)-n)//2:
        print(-1)
        break
   
    print(n//8 + 1)


发表于 2026-02-27 22:32:16 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for (int i = n / 8; i >= 0; i--) {
if ((n - i * 8) % 6 == 0) {
int j = (n - i * 8) / 6;
System.out.println(i + j);
return;
}
}
System.out.println(-1);
}
}
发表于 2026-02-23 22:23:03 回复(0)
#include <iostream>
using namespace std;
int main() {
    int n,s;cin>>n;
    if(n<14&&(n==6||n==8||n==12)) s=1;
    else if(n>=14&&n%2==0) s=1;
    else s=0;
    if(s==1){
        if(n<14&&n==6||n==8) cout<<1;
        else if(n<14&&n==12) cout<<2;
        else{
            if(n%8==0) cout<<n/8;
            else cout<<n/8+1;
        }
    }else{
        cout<<-1;
    }
}
发表于 2026-02-18 22:51:11 回复(0)
#include<bits/stdc++.h>
using namespace std;

using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;

void solve()
{
    int n,MIN=-1;
    cin >> n;
    if(n<6)//小于6绝对不行
    {
        cout << MIN;
        return;
    }
    for(int i=0;;i++)//暴力找方案
    {
        int temp=i*8;
        if(n-temp<0) break;
        if((n-temp)%6==0) MIN=i+(n-temp)/6;
    }
    cout << MIN;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
   
    int t=1;
    //cin >> t;
   
    while(t--)
    {
        solve();
    }
    return 0;
}

发表于 2026-02-10 15:52:24 回复(0)
#include <iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    int count = -1;
    for(int i = n / 8; i >= 0; --i){
        int a = n - 8 * i;
        if(a % 6 == 0){
            count = a / 6 + i;
            break;
        }
    }
    cout << count << endl;
    return 0;
}

发表于 2026-02-03 01:43:39 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    int k=-1;
    for(int i=0;i<(n/6+1);i++){
        if((n-(i*6))%8==0){
            k=i+(n-(i*6))/8;
            break;
        }
    }
    printf("%d",k);
}
发表于 2026-01-31 14:16:18 回复(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)

问题信息

上传者:小小
难度:
62条回答 5840浏览

热门推荐

通过挑战的用户

查看代码
买橘子