1. 程式人生 > >C/C++ 演算法分析與設計:貪心(等價交換)

C/C++ 演算法分析與設計:貪心(等價交換)

題目描述

黑龍江的五常大米全國聞名,每年到了秋天,農民們把自己家的大米到集市上去買,但由於五常地區還是一個比較落後的地方,還實行物物交換,即農民用大米換白麵,可以用來蒸饅頭啊!每個集市上大米換白麵的比例並不相等,如何能用最少的大米換到最多的白麵呢?(單位是斤)

輸入

輸入資料有多組,每組資料的第一行有2個數:m和n,m代表大米的斤數,n代表有n集市,接下來有n行,每行2個數t1和t2,表示在這個集市可以用t1斤的大米換t2斤的白麵(只有t2斤的白麵)。

輸出

輸出m斤大米能換到的白麵的最大值(結果保留2位小數)

樣例輸入

5 3
1 2
4 9
1 5

樣例輸出

14.00
#include<stdio.h>
int main()
{
	int n,m,i,j,p,s=0;
	double a[10][3],sum=0,t1,t,t2;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%lf%lf",&a[i][0],&a[i][1]);
		a[i][2]=a[i][1]/a[i][0];
	}
	for(i=0;i<m;i++)
	{
		p=i;
		for(j=i+1;j<m;j++)
			if(a[j][2]>a[p][2]) p=j;
		if(p!=i){ t=a[i][0];a[i][0]=a[p][0];a[p][0]=t;
		          t2=a[i][2];a[i][2]=a[p][2];a[p][2]=t2;
				  t1=a[i][1];a[i][1]=a[p][1];a[p][1]=t1; }
				if(s+a[i][0]>=n)
		{sum+=a[i][1];sum=sum+((s+a[i][0]-n)*a[i][2]);printf("%.2lf\n",sum);break;}
		else
		{s+=a[i][0];sum+=a[i][1];}
	}
}