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 } 這才是正確代碼==?
轉載于:https://www.cnblogs.com/RisingGods/p/8127275.html
總結
以上是生活随笔為你收集整理的LuoGu P1909 买铅笔???的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博客转移至:www.bugsafe.cn
- 下一篇: PAT 1057. 数零壹