LuoGu P1909 買鉛筆???
題目描述
P老師需要去商店買n支鉛筆作為小朋友們參加NOIP的禮物。她發現商店一共有 3種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,價格也有可能不同。為了公平起 見,P老師決定只買同一種包裝的鉛筆。
商店不允許將鉛筆的包裝拆開,因此P老師可能需要購買超過n支鉛筆才夠給小朋 友們發禮物。
現在P老師想知道,在商店每種包裝的數量都足夠的情況下,要買夠至少n支鉛筆*最少*需要花費多少錢。
輸入格式:
輸入的第一行包含一個正整數n,表示需要的鉛筆數量。
接下來三行,每行用兩個正整數描述一種包裝的鉛筆:其中第一個整數表示這種 包裝內鉛筆的數量,第二個整數表示這種包裝的價格。
保證所有的7個數都是不超過10000的正整數。
輸出格式:
輸出一行一個整數,表示P老師最少需要花費的錢。
鏈接 https://www.luogu.org/problemnew/show/1909
說實話吧,這個題確實不太想寫(大水題兒??居然還因為0x3fWA了一次。。。真是智障了@_@),可是機房的小夥伴居然有不會的。。。只能勉為其難了==
這個題確實沒太有什麽難點,就是學了幾個周的小夥伴都能有思路,一共有三種包裝,每一種包裝裏都會包含一定數量的鉛筆,並有一定的價格,我們用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 買鉛筆???