典型贪心算法的运用。
#include<stdio.h> #include<algorithm> #define For(i,m,n) for(i=m;i<n;i++) using namespace std; typedef struct room { double j,f; }room; room r[1005]; //double rio[1005]; bool cmp(const room &a,const room &b) { return (a.j/a.f)>(b.j/b.f); } int main() { int n,i; double count,m; while(scanf("%lf%d",&m,&n)&&m!=-1&&n!=-1) { count=0; For(i,0,n) { scanf("%lf%lf",&r[i].j,&r[i].f); } sort(r,r+n,cmp);i=0; while(m>0&&i<n)//i<n是应该要注意的点,可能它是一只特别“有钱”的猫 { if(m>r[i].f) { m=m-r[i].f; count+=r[i].j; i++; } else { count+=m*(r[i].j/r[i].f); m=m-r[i].f; } } printf("%.3lf\n",count); } return 0; }