貪心之oj.1797
阿新 • • 發佈:2018-12-23
1797:金銀島
- 總時間限制:
- 3000ms
- 記憶體限制:
- 65536kB
- 描述
-
某天KID利用飛行器飛到了一個金銀島上,上面有許多珍貴的金屬,KID雖然更喜歡各種寶石的藝術品,可是也不拒絕這樣珍貴的金屬。但是他只帶著一個口袋,口袋至多隻能裝重量為w的物品。島上金屬有s個種類, 每種金屬重量不同,分別為n
1, n
2, ... , n
s,同時每個種類的金屬總的價值也不同,分別為v
1,v
2
- 輸入
-
第1行是測試資料的組數k,後面跟著k組輸入。
每組測試資料佔3行,第1行是一個正整數w (1 <= w <= 10000),表示口袋承重上限。第2行是一個正整數s (1 <= s <=100),表示金屬種類。第3行有2s個正整數,分別為n 1, v 1, n 2, v 2, ... , n s, v s分別為第一種,第二種,...,第s種金屬的總重量和總價值(1 <= n i - 輸出
- 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<cstdio>
#include<algorithm>
using namespace std;
struct zhubao
{
double wei,vau,avr;
}a[10005];
bool cmp(zhubao &x,zhubao &y)
{
return x.avr>y.avr;
}
int main()
{
int n,w,s;
scanf("%d",&n);
for(int q=1;q<=n;q++)
{
double totwei=0,tot=0;
scanf("%d%d",&w,&s);
for(int j=1;j<=s;j++)
{
scanf("%lf%lf",&a[j].wei,&a[j].vau);
a[j].avr = a[j].vau/a[j].wei;
}
sort(a+1,a+s+1,cmp);
for(int i=1;i <= s;i++)
{
if(a[i].wei+totwei<=w)
{
totwei+=a[i].wei;
tot+=a[i].vau;
}
else
{
int sum=0;
sum=w-totwei;
tot+=sum*a[i].avr;
break;
}
}
printf("%.2lf\n",tot);
}
return 0;
}
主要是比較每塊珠寶的平均價 評均價個高的優先 就可以做到最後得到的是最高的
無後效性:不改變每塊的價值
寫了好久啊 終於d完了
錯因:tot 沒有清0
else 中 tot算的不對 用之前算過的平均價值算才對