- 題目描述:
-
大家一定都看過《名偵探柯南》,我最開始看的是小說版本的,後來出了漫畫版本,現在又有了動畫片的版本。
引用彪叔的一條飛信:做男人就要做柯南。變得了正太,飈的到女聲;學得好化學,射的了麻醉;踢得好足球,玩得好極限;破得了大案,幹得過黑社會;開得了飛機,躲得過機槍;停得了爆炸,引得了雪崩,最牛的是有一個十幾年只見了他幾面卻依舊死心踏地念念不忘的好女友。
好了,書歸正傳,現在,柯南又遇到了一個棘手的案子:一個貴族的家裏被盜。這個貴族的家裏非常有錢,但這家主人的習慣很怪異,他將所有的金銀珠寶都磨成粉裝到幾個分開的袋子裏。由於之前並沒有記錄,所以主人並不知道這次被盜自己損失了多少錢。幾天後,盜竊犯被抓住,但是他身上僅有一個盜竊時用的包,盜竊走的財產早已經揮霍一空。很顯然,盜竊犯一定會使自己偷走的東西的總價值最大,柯南雖然斷案如神,但是他卻無法計算出盜竊犯到底盜走了價值多少錢的東西。你能幫幫柯南嗎?
- 輸入:
-
每組測試數據可能有多組輸入,對於每一組輸入,
輸入的第一行包括兩個整數N(1<=N<=100000),代表主人所擁有的被磨成粉的珠寶的種類數。以及C(1<=C<=10000000),代表盜竊犯盜竊時所用的包的容量。
接下來的N行,每行包括兩個數W(1<=W<=10000000) 以及V(1<=V<=10000000),分別代表一類珠寶粉的總重量,以及這類珠寶粉的總價值。
- 輸出:
-
輸出盜竊犯所盜走物品的總價值。
- 樣例輸入:
-
2 10
4 12
8 16
- 樣例輸出:
-
24
- 提示:
- 若最後得到的被盜物品的總價值不是整數,請你將答案四捨五入後輸出。
1. 所謂“每種物品”是幌子,其實每種物品僅有一件
2. 注意貪心與揹包的區別:
這道題類似fat mouse trade,即可以取非整數件物品,所以按單價排序,依次拿一件,直到容量不夠了選非整數件,貪心即可
而揹包必須選整數件物品,應dp
3. 最後要求四捨五入。
- #include "iostream"
- #include "stdio.h"
- #include "math.h"
- #include "vector"
- #include "queue"
- #include "memory.h"
- #include "algorithm"
- #include "string"
- using namespace std;
- #define N 100001
- #define max(a,b) a>b?a:b
- #define min(a,b) a<b?a:b
- #define eps 1e-7
- int n;
- double c;
- double g[N][3];
- int comp(const void *a,const void *b)
- {
- return *((double *)b+2)>*((double *)a+2)?1:-1;
- }
- int main()
- {
- while(scanf("%d%lf",&n,&c)!=EOF)
- {
- int i,j;
- for(i=0;i<n;i++)
- {
- scanf("%lf%lf",&g[i][0],&g[i][1]);
- g[i][2]=g[i][1]/g[i][0];
- }
- qsort(g,n,sizeof(double)*3,comp);
- double sum=0;
- for(i=0;i<n;i++)
- {
- if(c>=g[i][0])
- {
- c-=g[i][0];
- sum+=g[i][1];
- }
- else
- {
- sum+=g[i][1]*c/g[i][0];
- break;
- }
- }
- printf("%d\n",(int)(sum+0.5));
- }
- }