HDU1009
题意:有n个房子,每个房子里都有老鼠喜欢吃的咖啡豆J[i],但是每个房子都有猫看守,老鼠现在手上有M的猫粮。可以用猫粮换咖啡豆,每只猫都有猫粮的要求F[i]。老鼠得到的咖啡豆是J[i]*a% a%=给的猫粮/F[i] 求最多可以得到多少咖啡豆
思路:没看懂英文,所以搜了一下,看见他们说贪心... 其实也就是比例问题,每份F[i]可以换到越多的J[i]越好 , 依着这个思路排序 然后在循环求答案就好了...
代码如下:
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; double K[1000]; struct jfpoint { double J,F; double K; }; jfpoint JF[1000]; bool paixu(jfpoint a,jfpoint b) { return a.K>b.K; } int main() { int M,N; double ans=0; while(scanf("%d%d",&M,&N)) { double ans=0; if(M<0||N<0) break; for(int i=0; i<N; i++) { scanf("%lf%lf",&JF[i].J,&JF[i].F); JF[i].K=JF[i].J/JF[i].F; } sort(JF,JF+N,paixu); for(int i=0; i<N; i++) { if(M>=JF[i].F) { ans+=JF[i].J; M-=JF[i].F; //printf("M=%d\t取全部的ans=%.3lf\n",M,ans); continue; } if(M<JF[i].F) { ans+=M/JF[i].F*JF[i].J; M=0; //printf("\nM=%d\t取全部的ans=%.3lf\n",M,ans); break; } //printf("ans=%.3lf\n",ans); } printf("%.3lf\n",ans); } return 0; }