#7 2016NOIP複賽T1 買鉛筆

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章