打卡信奥刷题(464)用C++信奥P6188[普及组/提高] [NOI Online #1 入门组] 文具订购

[NOI Online #1 入门组] 文具订购

题目描述

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

  1. 圆规,每个 777 元。
  2. 笔,每支 444 元。
  3. 笔记本,每本 333 元。

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

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

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

输入格式

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

输出格式

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

否则输出一行三个用空格隔开的整数 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 616,保证 n≤14n \leq 14n14
  • 对于测试点 7∼127 \sim 12712,保证 nnn141414 的倍数。
  • 对于测试点 13∼1813 \sim 181318,保证 n≤100n \leq 100n100
  • 对于全部的测试点,保证 0≤n≤1050 \leq n \leq 10^50n105

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值