LuoGu P1909 买铅笔???

Posted risinggods

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LuoGu P1909 买铅笔???相关的知识,希望对你有一定的参考价值。

题目描述

  P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。

  商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。

  现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔*最少*需要花费多少钱。

输入格式:

  输入的第一行包含一个正整数n,表示需要的铅笔数量。

  接下来三行,每行用两个正整数描述一种包装的铅笔:其中第一个整数表示这种 包装内铅笔的数量,第二个整数表示这种包装的价格。

  保证所有的7个数都是不超过10000的正整数。

输出格式:

  输出一行一个整数,表示P老师最少需要花费的钱。

链接 https://www.luogu.org/problemnew/show/1909

  说实话吧,这个题确实不太想写(大水题儿??居然还因为0x3fWA了一次。。。真是智障了@[email protected]),可是机房的小伙伴居然有不会的。。。只能勉为其难了==

   这个题确实没太有什么难点,就是学了几个周的小伙伴都能有思路,一共有三种包装,每一种包装里都会包含一定数量的铅笔,并有一定的价格,我们用n整除一下x,就会的到最少需要买这种包装的数量,然后将n/x在乘上y(包装的价格),就会得出只买这种包装最少需要的钱,一共三次,取这三次的最小值即可。

 

技术分享图片
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int n,m,ans=0x3fffffff,x,y;
 7     scanf("%d",&n);
 8     for(int i=1;i<=3;i++){
 9         scanf("%d%d",&x,&y);//x表示每个包装内铅笔的数量,y表示每个包装的价格;
10         m=n/x;
11         ans=min(ans,m*y);
12     }
13     printf("%d\n",ans);
14     return 0;
15 }
点击查看代码

 

  但是,我们漏了一个很重要的地方,也就是说,上面的代码是错误的解法(想一下为什么)。

  答案是:我们将 n/x (整除)将会的到下取整的答案,举个例子吧,当一共需要买 25(n) 只铅笔时,这种包装每个单位中有包含 17(x) 支铅笔,所以n/x会得到 1 而不是我们想要的 2 。但是如果是 n=25、x=5时,我们恰好能得到我们想要的答案(n/x) 5 ,也就是说当n能够整除x时  if(n%x==0),我们恰好能得到想要的答案,但  if(n%x!=0),我们会得到比想要的答案小 1 的结果,我们便需要将得到的 n/x ++。所以加上第二个if语句特判一下就可以完美的解决这个问题了!

 

技术分享图片
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int n,m,ans=0x3fffffff,x,y;
 7     scanf("%d",&n);
 8     for(int i=1;i<=3;i++){
 9         scanf("%d%d",&x,&y);//x表示每个包装内铅笔的数量,y表示每个包装的价格;
10         m=n/x;
11         if(n%x) m++;
12         ans=min(ans,m*y);
13     }
14     printf("%d\n",ans);
15     return 0;
16 }
这才是正确代码==

 

以上是关于LuoGu P1909 买铅笔???的主要内容,如果未能解决你的问题,请参考以下文章

洛谷——P1909 [NOIP2016 普及组] 买铅笔

买铅笔(NOIP2016 普及组第一题)

2016买铅笔

NOIP2016普及组

[解题报告] CSDN竞赛第17期

Luogu 1194买礼物