1. 程式人生 > >#7 2016NOIP複賽第一題 買鉛筆

#7 2016NOIP複賽第一題 買鉛筆

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;
}