タイトルの説明
ある日、KIDは空飛ぶクルマを使って、多くの貴金属が乗っている宝の島に飛びました。
KIDはあらゆる種類の宝石作品を好みますが、そのような貴金属を拒否することはありませんが、ポケットは1つしかなく、ポケットには最大で重量がwのアイテムしか収納できません。
島にはs種類の金属があり、それぞれ重量が異なり、n 1、n 2、…、n sであり、各種類の金属の合計値も異なります、v 1、v 2、…、v s。
KIDは一度にできるだけ多くの金属を取り去りたいと考え、彼にどれだけの金属を取り除けるか尋ねました。
金属は任意に分割でき、金属の値はその重量に比例することに注意してください。
入力形式
最初の行はテストデータグループの数kで、その後にkグループの入力が続きます。
テストデータの各グループは3行を占めます。
- 最初の行は正の整数wで、ポケットの重量の上限を表します。
- 2行目は正の整数sで、金属の種類を示します。
- 2S正の第3行目の整数、nはある1、V 1、N 2、V 2、...、N sは、のV Sが、それぞれ第一、第二、...、STH金属の合計重量の合計値であります
出力形式は
k行で、出力の各行は1つの入力に対応し、出力は小数点以下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
データ範囲
1≤S≤100
1≤10000≤W
1≤N I ≤10000、1≤V iは≤10000
問題解決
貪欲:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int T;
int n, m;
struct thing
{
int v, w;
double x;
}s[N];
bool cmp(thing a, thing b)
{
return a.x > b.x;
}
int main()
{
cin >> T;
while(T --)
{
cin >> m >> n;
for (int i = 1; i <= n; i ++)
{
cin >> s[i].v >> s[i].w;
s[i].x = 1.0 * s[i].w / s[i].v;
}
sort(s + 1, s + 1 + n, cmp);
double ans = 0;
for (int i = 1; i <= n; i ++)
if(m >= s[i].v)
{
m -= s[i].v;
ans += s[i].w;
}
else
{
ans += s[i].x * m;
break;
}
printf("%.2f\n", ans);
}
return 0;
}