猫和胖老鼠
FatMouse准备了M磅的Cat-Food,以便用来跟小Cat交换好吃的JavaBean。
现在有N个房间,第i个房间有J[i]磅的JavaBean,其交换的筹码是F[i]磅的Cat-Food。
当然,FatMouse还是有很大的选择权的,对任意一个房间,它可以只交换一部分的Cat-Food。
现要求FatMouse以怎样的策略才能获得最多的Cat-Food。
这也是一道简单 & 典型的贪心算法题,
这道贪心比HDOJ-ACM-1052-Tian Ji — The Horse Racing:田忌赛马要简单许多,
它的整体思路就是以javaBean/catFood比为基准,大比值房间优先。
/*#include <stdio.h> int main() { int M,N; while(scanf("%d%d",&M,&N)!=EOF) { int i,j,J[1000],F[1000],temp1; double ratio[1000],JavaBeans=0,temp; if((M==-1)&&(N==-1)) { return 0; } for(int i=0;i<N;i++) { scanf("%d%d",&J[i],&F[i]); ratio[i]=(J[i]*1.0)/F[i]; } for(i=0;i<N;i++) { for(j=0;j<N-i-1;j++) { if(ratio[j]<ratio[j+1]) { temp=ratio[j]; ratio[j]=ratio[j+1]; ratio[j+1]=temp; temp1=F[j]; F[j]=F[j+1]; F[j+1]=temp1; temp1=J[j]; J[j]=J[j+1]; J[j+1]=temp1; } } } for(i=0;i<N;i++) { if(M>=F[i]) { JavaBeans=J[i]+JavaBeans; M=M-F[i]; } else { JavaBeans=JavaBeans+ratio[i]*M; break; } } printf("%.3lf\n",JavaBeans); } return 0; }*/ #include<stdio.h> #include<algorithm> using namespace std; int a[10010]; int b[10010]; double c[10010]; int main () { int m,n; while(scanf("%d%d",&m,&n)==2) { if (m==-1&&n==-1) {break;} for (int i=0; i<n; i++) scanf("%d%d",&a[i],&b[i]); for(int i=0; i<n; i++) { c[i]=(a[i]*1.0)/b[i]; }double temp;int temp1;int temp2; for(int i=0; i<n; i++) { for(int j=0; j<n-i-1; j++) { if(c[j]<c[j+1]) { temp=c[j]; c[j]=c[j+1]; c[j+1]=temp; temp1=a[j]; a[j]=a[j+1]; a[j+1]=temp1; temp2=b[j]; b[j]=b[j+1]; b[j+1]=temp2; } } } float s=0; for (int i=0; i<n; i++) { if(m>=b[i]) { s=s+a[i];m=m-b[i]; } else { s=s+(c[i])*m; break; } } printf("%.3f\n",s); } return 0; } /* 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1*/