トレジャーアイランド(情報オリンピックワンブックパス-T1225)

タイトルの説明
ある日、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;
}

おすすめ

転載: blog.csdn.net/weixin_46239370/article/details/113844675