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 Ji pounds of JavaBeans and requires Fi pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get Ji* a% pounds of JavaBeans if he pays Fi* 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 Ji pounds of JavaBeans and requires Fi pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get Ji* a% pounds of JavaBeans if he pays Fi* 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; }