题目描述
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 }