问题标题: 酷町堂:6968

0
0
已解决
汪宇航
汪宇航
新手启示者
新手启示者

6968   文具订购

经验值:1200 时间限制:1000毫秒

4.2 数论

不许抄袭,一旦发现,直接清空经验!

题目描述 Description

小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品:

  1. 圆规,每个 7 元。
  2. 笔,每支 4 元。
  3. 笔记本,每本 3 元。

小明负责订购文具,设圆规,笔,笔记本的订购数量分别为 a,b,c,他订购的原则依次如下:

  1. n元钱必须正好用光,即7a+4b+3c=n。
  2. 在满足以上条件情况下,成套的数量尽可能大,即 a,b,c 中的最小值尽可能大。
  3. 在满足以上条件情况下,物品的总数尽可能大,即 a+b+c 尽可能大。

请你帮助小明求出满足条件的最优方案。可以证明若存在方案,则最优方案唯一。

输入描述 Input Description

输入仅一行一个整数,代表班费数量 n。

输出描述 Output Description

如果问题无解,请输出 -1。

否则输出一行三个用空格隔开的整数 a,b,c,分别代表圆规、笔、笔记本的个数。

样例输入 Sample Input

样例一: 33 样例二: 14 样例三: 1

样例输出 Sample Output

样例输出一: 1 2 6 样例输出二: 1 1 1 样例三输出: -1

数据范围及提示 Data Size & Hint

说明/提示
样例3:
a=2,b=4,c=1 也是满足条件 1,2 的方案,但对于条件 3,该方案只买了 7 个物品,不如a=1,b=2,c=6 的方案。

数据范围:
对于30%的数据: n≤14。
对于另外30%的数据: n 是14 的倍数。
对于另外30%的数据: n≤100。
对于100%的数据:0≤n≤10^5。

我彻底懵**。。。

WA15代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int ml=0,mx=0,my=0,mz=0,ma=0;
    bool x=0;
    for(int i=1;i<=n/7;i++){
        for(int j=1;j<=(n-i*7)/4;j++){
            for(int k=1;k<=(n-i*7-j*4)/3;k++){
                if(i*7+j*4+k*3==n){
                    x=1;
                    if(min(i,min(j,k))>=ml){
                        if(i+j+k>=mx){
                            ml=min(i,min(j,k));
                            mx=i+j+k;
                            my=i;
                            mz=j;
                            ma=k;
                        }
                    }
                }
            }
        }
    }
    if(x){
        cout<<my<<' '<<mz<<' '<<ma;
    }else{
        cout<<-1;
    }
    return 0;
}

 


0
已采纳
甄子烨
甄子烨
高级光能
高级光能

这题很水,是你想的太复杂了。

我也是看了下面的提示才做出来的。

我的思路:

3个循环,n/14到0,i到n/4,i到n/3。

直接在循环里面输出,然后return 0;

再在循环外面输出-1。

不多bibi,直接上核心:

for(int i=n/14;i>=0;i--){

for(int j=i;j<=n/4;j++){

for(int l=i;l<=n/3;l++){

if(i*7+j*4+l*3==n){ c

out<<i<<' '<<j<<' '<<l;

return 0;(被迫养成好习惯)

}

}

}

}

最后,求采纳!

(我俩可是一个工作室的啊!)

0
甄子烨
甄子烨
高级光能
高级光能

等等,先踩我,行吗?

我要回答