题意:
M N
J[i] F[i]
fatmouse有M克猫粮(类似吧),现在有个房间,F[i] pounds 猫粮 可以换 J[i] pounds javabeans.
(hdoj的discuss里有句话很搞:“在我查过大量的资料后,终于明白了,JavaBean是一种爪哇产的咖啡豆,肥鼠怎么可能喜欢吃这种东西...........”)
分析:
果断贪心,按照j/f 排序。WA了几次,还是因为思考问题不严密啊,真的要有意识地加强。严谨!!!.
1 0 和
0 1
1 0
这两组数据过不了,然后就断网了。继续把情况考虑了下.早上很早就起来交上去试试,结果行了。哎,郁闷。学姐也发给我一份她改过的,没考虑特殊情况,
只不过在判断条件上我用
if(M>a[i].f)
然后她是加了个=。这样就可以了。>_<
偶的丑代码:
#include <iostream> #include <cstdio> using namespace std; typedef struct p{ int j,f; double d; }point; int main() { int M,N; int i,j; double ff,res; point a[1005],temp; while(~scanf("%d%d",&M,&N)) { if(M==-1&&N==-1) break; res=0; if(N==0) printf("%.3f\n",res); for(i=0;i<N;i++) { cin>>a[i].j>>a[i].f; a[i].d=(double)a[i].j/a[i].f; } for(i=0;i<N;i++) { for(j=i;j<N;j++) { if(a[i].d<a[j].d) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<N;i++) { if(M>a[i].f) { res+=a[i].j; M-=a[i].f; if((i>=N-1&&M>0)||M==0) {printf("%.3f\n",res);break;} } else if(M<=a[i].f) { ff=(double)a[i].j/a[i].f; if(a[i].f==0) res+=a[i].j; else res+=ff*M; printf("%.3f\n",res); break; } } } return 0; }学姐的:#include <iostream> #include <cstdio> using namespace std; typedef struct p{ int j,f; double d; }point; int main() { int M,N; int i,j; double res; point a[1005],temp; while(~scanf("%d%d",&M,&N)) { if(M==-1&&N==-1) break; res=0; for(i=0;i<N;i++) { cin>>a[i].j>>a[i].f; a[i].d=(double)a[i].j/a[i].f; } for(i=0;i<N;i++) { for(j=i;j<N;j++) { if(a[i].d<a[j].d) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<N;i++) { if(M>=a[i].f)//条件注意 { res+=a[i].j; M-=a[i].f; if(M==0) break; } else if(M<a[i].f) { res+=a[i].d*M; break; } } printf("%.3f\n",res); } return 0; }