首页 > 试题广场 >

买橘子

[编程题]买橘子
  • 热度指数:18643 时间限制: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)
#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)
线性规划,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 <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> arr;

    for (int i = 0; i <= n / 6; ++i) {
        int rem = n - 6 * i;
        if (rem < 0){
            break;
        }
        for (int j = 0; j <= rem / 8; ++j) {
            if (6 * i + 8 * j == n) {
                arr.push_back(i + j);
            }
        }
    }

    if (arr.empty()) {
        cout << -1 << endl;
    }
    else {
        sort(arr.begin(), arr.end());
        cout << arr[0] << endl;
    }

    return 0;
}

发表于 2026-04-17 12:53:37 回复(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();
        //首先剔除8和6的结果
        if (n == 8 || n == 6) {
            System.out.println(1);
            return;
        }
        //存储n大于8时,对8的取除和余的结果i、j
        int i = n / 8;
        int j = n % 8;
        //j为0表示能够直接被8整除
        if (j == 0) {
            System.out.println(i);
            return;
        }
        //每轮都从除掉的数中取出8个和余数相加判断是否能被6整除,除结果减一
        for (int i1 = 0; i1 <= i; i1++) {
            int t = (i1 * 8 + j) / 6;
            //存在能被6整除的结果将除结果减去取的次数(8个橘子袋数)+除6的结果(6个橘子袋数)
            if ((i1 * 8 + j) % 6 == 0) {
                System.out.println(i - i1 + t);
                return;
            }
        }
        System.out.println(-1);
    }
}
发表于 2026-04-10 23:28:01 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        int c =-1;
        for(int i=a/8;i>=0;i--){
            if( (a-i*8)%6 == 0){
            c=i+(a-i*8)/6;
            break;}
        }
        System.out.print(c);
    }
}

发表于 2026-03-31 15:32:12 回复(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)