解题报告:
大意:一只老鼠有M磅的猫粮,另外有一只猫控制了老鼠的N个房间,这些房间里面放了老鼠爱吃的绿豆,给出每个房间的绿豆数量,和这个房间的绿豆所需要的猫粮数,现在要求老鼠用这M磅的猫粮最多能换到多少它爱吃的绿豆?
贪心题,由于所有的绿豆都是一样的,所以如果老鼠想要换到最多的绿豆,便可以换猫控制的房间里面最便宜的绿豆,也就是说先换取单位数量的绿豆所需要最少的猫粮的房间里的绿豆,这样就可以保证换到的绿豆是最多的。具体实现可以用一个结构体,里面保存每个房间里面有的绿豆的数量和换取这个房间的绿豆时所需要的猫粮的数量和换取这个房间的 单位重量的绿豆所需要的猫粮数(以下简称单价),然后再按照单价升序给这些结构体排一次序,这时就可以从最便宜的绿豆开始换了。

1 #include<stdio.h> 2 #include<algorithm> 3 struct node { 4 double j,f,velu; 5 }java[1000+5]; 6 double M; 7 int N; 8 bool cmp(node a,node b) { 9 return a.velu>b.velu; 10 } 11 int main() { 12 while(scanf("%lf%d",&M,&N)&&!(M==-1||N==-1)) { 13 double sum=0; 14 for(int i=1;i<=N;++i) { 15 scanf("%lf%lf",&java[i].j,&java[i].f); 16 java[i].velu=1.0*java[i].j/java[i].f; 17 } 18 if(N>1) 19 std::sort(java+1,java+N+1,cmp); 20 for(int i=1;;++i) { 21 if(N==0) 22 break; 23 if(M>=java[i].f) { 24 M-=java[i].f; 25 sum+=java[i].j; 26 } 27 else{ 28 sum+=1.0*M*java[i].j/java[i].f; 29 break; 30 } 31 } 32 printf("%.3lf\n",sum); 33 } 34 return 0; 35 }