1. 程式人生 > >金銀島

金銀島

sort () 時間限制 貴的 break logs 藝術品 ace pan

金銀島

鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1225


時間限制: 1000 ms 內存限制: 65536 KB

【題目描述】

某天KID利用飛行器飛到了一個金銀島上,上面有許多珍貴的金屬,KID雖然更喜歡各種寶石的藝術品,可是也不拒絕這樣珍貴的金屬。但是他只帶著一個口袋,口袋至多只能裝重量為w的物品。島上金屬有s個種類, 每種金屬重量不同,分別為n1,n2,...,ns,同時每個種類的金屬總的價值也不同,分別為v1,v2, ..., vs。KID想一次帶走價值盡可能多的金屬,問他最多能帶走價值多少的金屬。註意到金屬是可以被任意分割的,並且金屬的價值和其重量成正比。

【輸入】

第1行是測試數據的組數k,後面跟著k組輸入。

每組測試數據占3行,第1行是一個正整數w(1<=w<=10000),表示口袋承重上限。第2行是一個正整數s(1<=s<=100),表示金屬種類。第3行有2s個正整數,分別為n1,v1,n2,v2,...,ns,vs分別為第一種,第二種,...,第s種金屬的總重量和總價值(1<=ni <=10000,1<=vi<=10000)。

【輸出】

k行,每行輸出對應一個輸入。輸出應精確到小數點後2位。

【輸入樣例】

2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43

【輸出樣例】

171.93
508.00
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int w,s;
int f[10005];
struct Jew{
    int n,v;
    double per;
};
Jew jew[105];
bool cmp(Jew A,Jew B)
{
    if(A.per==B.per)return A.n>B.n;
    return A.per>B.per;
}
int main() { int k; cin>>k; while(k--) { cin>>w>>s; double ans=0; memset(f,0,sizeof(f)); for(int i=1;i<=104;i++) jew[i].n=jew[i].v=jew[i].per=0; for(int i=1;i<=s;i++) { int n,v; cin>>n>>v; jew[i].n=n;jew[i].v=v; jew[i].per=1.0*v/n; } sort(jew+1,jew+1+s,cmp); for(int i=1;i<=s;i++) { if(w>=jew[i].n) { w-=jew[i].n; ans+=jew[i].v; } else { ans+=w*jew[i].per; w-=w; } if(!w)break; } printf("%.2f\n",ans); } }

金銀島