买文具的奇葩解法

大家好,我是大白

在做题之前,我先给大家一个礼物

礼物

我发现有一些题很好笑,就是他让谁谁谁去买东西或者干什么事,但是却要让我们来解决这个问题

所以呢,今天这道题,就是小明去买文具(P6188)

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

  1. 圆规,每个 77 元。
  2. 笔,每支 44 元。
  3. 笔记本,每本 33 元。

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

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

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

输入格式

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

输出格式

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

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

输入输出样例

输入 #1

1

输出 #1

-1

输入 #2

14

输出 #2

1 1 1

输入 #3

33

输出 #3

1 2 6

说明/提示

样例输入输出 3 解释

a=2,b=4,c=1a=2,b=4,c=1 也是满足条件 1,21,2 的方案,但对于条件 33,该方案只买了 77 个物品,不如 a=1,b=2,c=6a=1,b=2,c=6 的方案。

好了,其实这道题有很多思路,像是我刚开始想要三重循环:

#include
using namespace std;
int n;
int a,b,c;
int minmax_=0;
int summax_=0;
int ans[3]={-1,-1,-1};
int main(){cin>>n;if(n==0){cout<<0<<" "<<0<<" "<<0;return 0;}for(a=0;asummax_){summax_=sum;ans[0]=a;ans[1]=b;ans[2]=c;}if(minmax_

结果很棒!

那当然改进一下,但是又发现改进完也就是少了一个TLE;

所以我想到了一个暴力好用的办法!

我们可以找规律:

#include
using namespace std;
int n;
int a,b,c;
int ans[14][3]={0,0,0,-1,-1,4,-1,0,3,0,0,1,0,1,0,-1,0,4,0,0,2,0,1,1,0,2,0,0,0,3,0,1,2,0,2,1,0,0,4,0,1,3
};
int main(){cin>>n;if(n==0){cout<<0<<" "<<0<<" "<<0;return 0;}if(n==1||n==2||n==5){cout<<-1;return 0;}int ans_=n/14;int m=n%14;cout<

就是用套数加上规律,就AC了!

记得关注、收藏、点赞!!!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章