#P1909 買鉛筆 的題解

題目描述

P老師須要去商店買n支鉛筆做爲小朋友們參加NOIP的禮物。她發現商店一共有 33種包裝的鉛筆,不一樣包裝內的鉛筆數量有可能不一樣,價格也有可能不一樣。爲了公平起 見,P老師決定只買同一種包裝的鉛筆。html

商店不容許將鉛筆的包裝拆開,所以P老師可能須要購買超過nn支鉛筆纔夠給小朋 友們發禮物。c++

如今P老師想知道,在商店每種包裝的數量都足夠的狀況下,要買夠至少nn支鉛筆最少須要花費多少錢。ide

輸入格式

第一行包含一個正整數nn,表示須要的鉛筆數量。測試

接下來三行,每行用22個正整數描述一種包裝的鉛筆:其中第11個整數表示這種 包裝內鉛筆的數量,第22個整數表示這種包裝的價格。spa

保證全部的77個數都是不超過1000010000的正整數。code

輸出格式

11個整數,表示P老師最少須要花費的錢。htm

輸入輸出樣例

輸入 #1

1 57
2 2 2
3 50 30
4 30 27
View Code

輸出 #1

1 57
View Code
 

輸入#2

1 9998
2 128 233
3 128 2333
4 128 666
View Code

輸出 #2

1 18407
View Code

輸入 #3

1 9999
2 101 1111
3 1 9999
4 1111 9999
View Code

輸出 #3

1 89991
View Code

說明/提示

鉛筆的三種包裝分別是:blog

  • 22支裝,價格爲22;
  • 5050支裝,價格爲3030;
  • 3030支裝,價格爲2727。

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
View Code

  題解

 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 }
View Code
相關文章
相關標籤/搜索