[NOI Online #1 入门组] 文具订购
题目描述
小明的班上共有 nnn 元班费,同学们准备使用班费集体购买 333 种物品:
- 圆规,每个 777 元。
- 笔,每支 444 元。
- 笔记本,每本 333 元。
小明负责订购文具,设圆规,笔,笔记本的订购数量分别为 a,b,ca,b,ca,b,c,他订购的原则依次如下:
- nnn 元钱必须正好用光,即 7a+4b+3c=n7a+4b+3c=n7a+4b+3c=n。
- 在满足以上条件情况下,成套的数量尽可能大,即 a,b,ca,b,ca,b,c 中的最小值尽可能大。
- 在满足以上条件情况下,物品的总数尽可能大,即 a+b+ca+b+ca+b+c 尽可能大。
请你帮助小明求出满足条件的最优方案。可以证明若存在方案,则最优方案唯一。
输入格式
输入仅一行一个整数,代表班费数量 nnn。
输出格式
如果问题无解,请输出 −1-1−1。
否则输出一行三个用空格隔开的整数 a,b,ca, b, ca,b,c,分别代表圆规、笔、笔记本的个数。
样例 #1
样例输入 #1
1
样例输出 #1
-1
样例 #2
样例输入 #2
14
样例输出 #2
1 1 1
样例 #3
样例输入 #3
33
样例输出 #3
1 2 6
提示
样例输入输出 3 解释
a=2,b=4,c=1a=2,b=4,c=1a=2,b=4,c=1 也是满足条件 1,21,21,2 的方案,但对于条件 333,该方案只买了 777 个物品,不如 a=1,b=2,c=6a=1,b=2,c=6a=1,b=2,c=6 的方案。
数据规模与约定
- 对于测试点 1∼61 \sim 61∼6,保证 n≤14n \leq 14n≤14。
- 对于测试点 7∼127 \sim 127∼12,保证 nnn 是 141414 的倍数。
- 对于测试点 13∼1813 \sim 1813∼18,保证 n≤100n \leq 100n≤100。
- 对于全部的测试点,保证 0≤n≤1050 \leq n \leq 10^50≤n≤105。
C++实现
#include
#include
using namespace std;
int n;
int main(void){
cin>>n;
if(n == 0)//特判
{
cout<<“0 0 0”<<endl;
return 0;
}
for(int p=n/14;p>=0;p--){
for(int j=p;j<=n/4;j++)//枚举b
for(int k=p;k<=n/3;k++)//枚举c
if(p*7+j*4+k*3 == n)//如果有解
{
cout<<p<<" "<<j<<" "<<k<<endl;
return 0;//输出,结束程序
}
}
cout<<"-1"<<endl;//无解输出-1
return 0;//完美AC~
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
1128

被折叠的 条评论
为什么被折叠?



