HDU 1009 FatMouse「貿易の説明

免責事項:著者ジンの心、ジン・スペース住所:のhttp://blog.csdn.net/kenden23/。これは、著者の同意なしに複製することはできません。https://blog.csdn.net/kenden23/article/details/31418535

問題の説明
FatMouseは彼の好きな食べ物、JavaBeansを含む倉庫を守る猫と取引する準備ができて猫の餌のMポンドを準備しました。
倉庫には、Nの客室を提供しています。i番目の部屋は、JavaBeansのJ [i]はポンドが含まれており、キャットフードのF [i]のポンドが必要です。FatMouseはキャットフードの[i]は*%のポンド彼はFを支払った場合に代わりに、彼はのJavaBeansのJ [i]は*%のポンドを得ることができ、部屋の中のすべてのJavaBeansのために取引する必要はありません。ここでは実数です。今、彼はあなたに、この宿題を割り当てている。彼に彼が得ることができたJavaBeansの最大量を教えてください。
 

入力
入力は複数のテストケースから構成されています。それぞれ[i]は、各テストケースは、2つの非負整数MとNを含む行から始まるN行は、次の各2つの非負整数を含むJ [i]とF。最後のテストケースは2つの-1年代が続いています。すべての整数は1000年より大きくありません。
 

出力
各テストケースのために、一列にFatMouseを得ることができるのJavaBeansの最大量は小数点第3位まで正確実数を印刷。
 

サンプル入力
 
   
5 3 7 2 3 4 5 2 20 3 25 18 24 15 15 10 -1 -1
 

サンプル出力
 
   
13.333 31.500

水の問題貪欲法、

:これは、個々の単語を理解することは困難である彼にのは、JavaBeansののJ [I]は*彼の%は、CATのIF F. [I] *食品A%ポンドを支払うポンド得ることができます

このような発現は、いくつかの部分を購入することができます。

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
struct twoInts
{
	int j, f;
	bool operator<(const twoInts two) const
	{
		double a = (double)j / (double)f;
		double b = (double)two.j / (double)two.f;
		return a > b;
	}
};

int main()
{
	int M, N;
	while (scanf("%d %d", &M, &N) && -1 != M)
	{
		vector<twoInts> vt(N);
		for (int i = 0; i < N; i++)
		{
			scanf("%d", &vt[i].j);
			scanf("%d", &vt[i].f);
		}
		sort(vt.begin(), vt.end());
		double maxBean = 0.0;
		for (int i = 0; i < N; i++)
		{
			if (M >= vt[i].f)
			{
				maxBean += vt[i].j;
				M -= vt[i].f;
			}
			else
			{
				maxBean += (double)vt[i].j * M / (double)vt[i].f;
				break;
			}
		}
		printf("%.3lf\n", maxBean);
	}
	return 0;
}




おすすめ

転載: www.cnblogs.com/ldxsuanfa/p/10930058.html