P老師須要去商店買n支鉛筆做爲小朋友們參加NOIP的禮物。她發現商店一共有 33種包裝的鉛筆,不一樣包裝內的鉛筆數量有可能不一樣,價格也有可能不一樣。爲了公平起 見,P老師決定只買同一種包裝的鉛筆。html
商店不容許將鉛筆的包裝拆開,所以P老師可能須要購買超過nn支鉛筆纔夠給小朋 友們發禮物。c++
如今P老師想知道,在商店每種包裝的數量都足夠的狀況下,要買夠至少nn支鉛筆最少須要花費多少錢。ide
第一行包含一個正整數nn,表示須要的鉛筆數量。測試
接下來三行,每行用22個正整數描述一種包裝的鉛筆:其中第11個整數表示這種 包裝內鉛筆的數量,第22個整數表示這種包裝的價格。spa
保證全部的77個數都是不超過1000010000的正整數。code
11個整數,表示P老師最少須要花費的錢。htm
1 57 2 2 2 3 50 30 4 30 27
1 57
1 9998 2 128 233 3 128 2333 4 128 666
1 18407
1 9999 2 101 1111 3 1 9999 4 1111 9999
1 89991
鉛筆的三種包裝分別是:blog
P老師須要購買至少5757支鉛筆。input
若是她選擇購買第一種包裝,那麼她須要購買2929份,共計2 \times 29 = 582×29=58支,須要花費的錢爲2 \times 29 = 582×29=58。it
實際上,P老師會選擇購買第三種包裝,這樣須要買22份。雖然最後買到的鉛筆數 量更多了,爲30 \times 2 = 6030×2=60支,但花費卻減小爲27 \times 2 = 5427×2=54,比第一種少。
對於第二種包裝,雖然每支鉛筆的價格是最低的,但要夠發必須買22份,實際的花費達到了 30 \times 2 = 6030×2=60,所以P老師也不會選擇。
因此最後輸出的答案是5454。
【子任務】
子任務會給出部分測試數據的特色。若是你在解決題目中遇到了困難,能夠嘗試 只解決一部分測試數據。
每一個測試點的數據規模及特色以下表:
上表中「整倍數」的意義爲:若爲KK,表示對應數據所須要的鉛筆數量nn—定是每種包裝鉛筆數量的整倍數(這意味着必定能夠不用多買鉛筆)。
使用位運算來進行大幅度累加,是倍增的思想
1 i<<1 等同於 i*2
1 #include<bits/stdc++.h> 2 using namespace std; 3 int i,j,k,n,m,w,ans; 4 int main() 5 { 6 scanf("%d",&n); 7 for(i=0;i<3;i++) 8 { 9 scanf("%d%d",&j,&k); 10 m=j; 11 w=k;//輸入並存下初始的價格與數量 12 while(j<n) 13 { 14 j<<=1; 15 k<<=1;//價格與數量不斷*2直到數量大於n 16 } 17 while(j>n) 18 { 19 j-=m; 20 k-=w;//*2有可能致使買太多了,減去一些 21 } 22 while(j<n) 23 { 24 j+=m; 25 k+=w;//減去以後又可能太少了,加上一些 26 } 27 if(k<ans||ans==0) 28 ans=k;//判斷是不是最小花費 29 } 30 printf("%d\n",ans); 31 return 0;//輸出並返回 32 }