hdu-1009 FatMouse' Trade(貪心算法)

題目大意:

老鼠有M磅貓食。有N個房間,每個房間前有一隻貓,房間裏有老鼠最喜歡的食品JavaBean,J[i]。若要引開貓,必須付出相應的貓食F[i]。當然這隻老鼠沒必要每次都付出所有的F[i]。若它付出F[i]a%,則得到J[i]a%。求老鼠能喫到的做多的JavaBean

解題思路:

老鼠要獲得最多的食品,就要用最小的貓食換取最多的貓食,這就要求J[i]/F[i]的比例要大。J[i]/F[i]的比例越大,證明在這個房間,小鼠付出得到的收穫最有價值。於是我們將設置結構體,結構體裏設置percent放置J[i]/F[i]。然後對結構體數組進行排序。依次按比例排序的付出貓食,即可。

例子:

輸入

5 3

7 2

4 3

5 2

J[i]/F[i]排序後:

7 2

5 2

4 3

在第一排數據上,小鼠付出2個貓食換得7JavaBean

在第二排數據上,小鼠付出2個貓食換得5JavaBean

在第三排數據上,小鼠只剩下1個貓食,便用這一個貓食換取1/3*4JavaBean

所以,總共換得13.333JavaBan


#include <stdio.h>
#include <algorithm>
using namespace std;
struct Trade {
	int j, f;
	double percent;
} mouse[3001];
bool cmp(Trade a, Trade b)
{
	return a.percent > b.percent;
}
int main(void)
{
	int n, m;
	while(scanf("%d%d", &m, &n)!=EOF && (m!= -1 || n != -1))
	{
		int i;
		
		for(i = 0; i < n; i++)// 輸入數據 
		{
			scanf("%d %d", &mouse[i].j, &mouse[i].f);
			mouse[i].percent = (double)mouse[i].j / mouse[i].f;
		}
		sort(mouse, mouse + n, cmp);
		double sum = 0; // 換得的javaBean之和 
		
		for(i = 0; i < n; i++)
		{
			if(m > mouse[i].f)// m是手中的貓食 
			{
				sum += mouse[i].j;// 換得的javaBean之和
				m -= mouse[i].f;// 減去所需要的貓食 
			}
			else
			{
				sum += mouse[i].percent * m;
				m = 0;
				break;
			}
		}
		printf("%.3lf\n", sum);
	}
	
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章