C/C++ 演算法分析與設計:貪心(等價交換)
阿新 • • 發佈:2018-12-14
題目描述
黑龍江的五常大米全國聞名,每年到了秋天,農民們把自己家的大米到集市上去買,但由於五常地區還是一個比較落後的地方,還實行物物交換,即農民用大米換白麵,可以用來蒸饅頭啊!每個集市上大米換白麵的比例並不相等,如何能用最少的大米換到最多的白麵呢?(單位是斤)
輸入
輸入資料有多組,每組資料的第一行有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];} } }