1. 程式人生 > >LuoGu P1909 買鉛筆???

LuoGu P1909 買鉛筆???

clu 正整數 img open noip tdi 答案 技術 isp

題目描述

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

  商店不允許將鉛筆的包裝拆開,因此P老師可能需要購買超過n支鉛筆才夠給小朋 友們發禮物。

  現在P老師想知道,在商店每種包裝的數量都足夠的情況下,要買夠至少n支鉛筆*最少*需要花費多少錢。

輸入格式:

  輸入的第一行包含一個正整數n,表示需要的鉛筆數量。

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

  保證所有的7個數都是不超過10000的正整數。

輸出格式:

  輸出一行一個整數,表示P老師最少需要花費的錢。

鏈接 https://www.luogu.org/problemnew/show/1909

  說實話吧,這個題確實不太想寫(大水題兒??居然還因為0x3fWA了一次。。。真是智障了@_@),可是機房的小夥伴居然有不會的。。。只能勉為其難了==

   這個題確實沒太有什麽難點,就是學了幾個周的小夥伴都能有思路,一共有三種包裝,每一種包裝裏都會包含一定數量的鉛筆,並有一定的價格,我們用n整除一下x,就會的到最少需要買這種包裝的數量,然後將n/x在乘上y(包裝的價格),就會得出只買這種包裝最少需要的錢,一共三次,取這三次的最小值即可。

技術分享圖片
 1
#include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int n,m,ans=0x3fffffff,x,y; 7 scanf("%d",&n); 8 for(int i=1;i<=3;i++){ 9 scanf("%d%d",&x,&y);//x表示每個包裝內鉛筆的數量,y表示每個包裝的價格; 10 m=n/x; 11 ans=min(ans,m*y); 12
} 13 printf("%d\n",ans); 14 return 0; 15 }
點擊查看代碼

  但是,我們漏了一個很重要的地方,也就是說,上面的代碼是錯誤的解法(想一下為什麽)。

  答案是:我們將 n/x (整除)將會的到下取整的答案,舉個例子吧,當一共需要買 25(n) 只鉛筆時,這種包裝每個單位中有包含 17(x) 支鉛筆,所以n/x會得到 1 而不是我們想要的 2 。但是如果是 n=25、x=5時,我們恰好能得到我們想要的答案(n/x) 5 ,也就是說當n能夠整除x時 if(n%x==0),我們恰好能得到想要的答案,但 if(n%x!=0),我們會得到比想要的答案小 1 的結果,我們便需要將得到的 n/x ++。所以加上第二個if語句特判一下就可以完美的解決這個問題了!

技術分享圖片
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int n,m,ans=0x3fffffff,x,y;
 7     scanf("%d",&n);
 8     for(int i=1;i<=3;i++){
 9         scanf("%d%d",&x,&y);//x表示每個包裝內鉛筆的數量,y表示每個包裝的價格;
10         m=n/x;
11         if(n%x) m++;
12         ans=min(ans,m*y);
13     }
14     printf("%d\n",ans);
15     return 0;
16 }
這才是正確代碼==

LuoGu P1909 買鉛筆???