#7 2016NOIP複賽第一題 買鉛筆
阿新 • • 發佈:2018-12-13
Time Limit: 1000 ms Memory Limit: 512 MB Description P老師需要去商店買n支鉛筆作為小朋友們參加NOIP的禮物。她發現商店一共有 3種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,價格也有可能不同。為了公平起 見,P老師決定只買同一種包裝的鉛筆。
商店不允許將鉛筆的包裝拆開,因此P老師可能需要購買超過n支鉛筆才夠給小朋友們發禮物。
現在P老師想知道,在商店每種包裝的數量都足夠的情況下,要買夠至少n支鉛筆最少需要花費多少錢。
Input 第一行包含一個正整數n,表示需要的鉛筆數量。
接下來三行,每行用2個正整數描述一種包裝的鉛筆:其中第1個整數表示這種 包裝內鉛筆的數量,第2個整數表示這種包裝的價格。
保證所有的77個數都是不超過10000的正整數。
Output 1個整數,表示P老師最少需要花費的錢。
Sample Input 57 2 2 50 30 30 27 Sample Output 54 89991
【說明】 鉛筆的三種包裝分別是: 2支裝,價格為2; 50支裝,價格為30; 30支裝,價格為27。 P老師需要購買至少57支鉛筆。 如果她選擇購買第一種包裝,那麼她需要購買29份,共計2×29=58支,需要花費的錢為2×29=58。 實際上,P老師會選擇購買第三種包裝,這樣需要買2份。雖然最後買到的鉛筆數量更多了,為30×2=60支,但花費卻減少為7×2=54,比第一種少。 對於第二種包裝,雖然每支鉛筆的價格是最低的,但要夠發必須買2份,實際的花費達到了30×2=60,因此P老師也不會選擇。 所以最後輸出的答案是54。
這一道題果斷直接進行模擬,可以採用每輸入兩個數就更新答案的方式。
程式碼:
#include<cstdio> using namespace std; int n,f[3][2],ans=9999999;//f陣列分別表示數量、價格 inline int min(int a,int b){ return a<b?a:b; //cstdio函式中不包含max、min函式 } int main(){ scanf("%d",&n); for(int i=0;i<3;i++){ scanf("%d%d",&f[i][0],&f[i][1]);//輸入一組就更新一次答案 if(n%f[i][0]==0)ans=min(ans,n/f[i][0]*f[i][1]);//如果購買數量被當前盒子裡的鉛筆數量整除,則 直接取結果 else ans=min(ans,(n/f[i][0]+1)*f[i][1]);//否則要多買一盒 } printf("%d",ans); return 0; }