6968 文具订购
经验值:1200 时间限制:1000毫秒
4.2 数论
不许抄袭,一旦发现,直接清空经验!
题目描述 Description
小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品:
- 圆规,每个 7 元。
- 笔,每支 4 元。
- 笔记本,每本 3 元。
小明负责订购文具,设圆规,笔,笔记本的订购数量分别为 a,b,c,他订购的原则依次如下:
- n元钱必须正好用光,即7a+4b+3c=n。
- 在满足以上条件情况下,成套的数量尽可能大,即 a,b,c 中的最小值尽可能大。
- 在满足以上条件情况下,物品的总数尽可能大,即 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;
}
这题很水,是你想的太复杂了。
我也是看了下面的提示才做出来的。
我的思路:
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;(被迫养成好习惯)
}
}
}
}
最后,求采纳!
(我俩可是一个工作室的啊!)