FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
The warehouse has N rooms. The i-th room contains J i pounds of JavaBeans and requires F i pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J i * a% pounds of JavaBeans if he pays F i * a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.
The warehouse has N rooms. The i-th room contains J i pounds of JavaBeans and requires F i pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J i * a% pounds of JavaBeans if he pays F i * a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.
5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
13.333 31.500
这道题基本的意思是:
先输入两个数,第一个代表猫粮的数量,第二个代表房间对的数量,接下来输入各个房间豆子的数量以及对应需要的猫粮数,根据豆子数与猫粮数的比值大小计算总共能换取多少豆子。
c++:
#include<iostream> #include<algorithm> #include<iomanip> using namespace std; struct tt { double a; //candy int b; //number double c; //chance }z[1010]; bool compare(tt a,tt b) { return a.c>b.c; } int main() { //ios::sync_with_stdio("pause"); int m,n; while(cin >> m >> n) { double s1=0; if(m==-1&&n==-1) { break; } // tt *z=new tt[n]; for(int i=0;i<n;++i) { cin >> z[i].a >> z[i].b; z[i].c=z[i].a/z[i].b; //cout << z[i].c << endl;; } sort(z,z+n,compare); for(int i=0;i<n;++i) { if(m>z[i].b) { m-=z[i].b; s1+=z[i].a; } else { s1+=z[i].c*m; break; } // cout << "df" << s << endl; } cout.setf(ios::fixed); cout << setprecision(3) << s1 << endl; } return 0; }