标签:
贪心问题,我的可能不是最优解,但是比较通俗易懂,注释也比较易懂,与大家分享
1 #include <iostream> 2 #include <iomanip> 3 #include <string.h> 4 5 using namespace std; 6 7 double J[1000]; 8 double F[1000]; 9 double Ratio[1000]; 10 11 int FindMax() //返回最大值的下标 12 { 13 double max = 0; 14 int key; 15 for(int k = 0;k < 1000;k ++) 16 if(max < Ratio[k]) 17 { 18 max = Ratio[k]; 19 key = k; 20 } 21 return key; 22 } 23 24 int main() 25 { 26 27 int m,n; 28 int i,j,key; 29 double result; 30 while((cin>>m>>n)) 31 { //最外层循环,表示测试用例的个数 32 if((m == -1) && (n == -1)) break; 33 memset(J,0,1000 * sizeof(double)); 34 memset(F,0,1000 * sizeof(double)); 35 result = 0; 36 for(i = 0;i < n;i++) 37 cin>>J[i]>>F[i]; //输入 38 for(i = 0;i < n;i++) 39 { 40 if(F[i] != 0) 41 Ratio[i] = J[i]/F[i]; //计算单位的比例 42 else 43 Ratio[i] = J[i]; 44 } 45 46 47 //特殊情况,当F的值为0时,首先全部累加到result 48 if(n == 0) 49 { 50 result == 0; 51 cout<<setiosflags(ios::fixed)<< setprecision(3)<<result<<endl; 52 continue; 53 } 54 for(j = 0;j < n;j ++) 55 { 56 if(F[j] == 0) 57 result += J[j]; 58 } 59 if(m == 0) 60 cout<<setiosflags(ios::fixed)<< setprecision(3)<<result<<endl; 61 62 //计算一个测试用例的结果 63 key = FindMax(); 64 while(m > 0) 65 { 66 if(m <= F[key]) 67 { 68 result += Ratio[key] * m; 69 cout<<setiosflags(ios::fixed)<< setprecision(3)<<result<<endl; 70 m = 0; //准备退出,计算完毕 71 } 72 else 73 { 74 result += Ratio[key] * F[key]; 75 m = m - (int)F[key]; //m减少 76 Ratio[key] = 0.0; //更新比例的值 77 key = FindMax(); //更新key的值 78 } 79 } 80 81 } 82 83 return 0; 84 }
标签:
原文地址:http://www.cnblogs.com/baichenjia/p/4200793.html