首页 > 代码库 > HDOJ1009

HDOJ1009

贪心问题,我的可能不是最优解,但是比较通俗易懂,注释也比较易懂,与大家分享

 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             else43                 Ratio[i] = J[i];44         }45 46 47         //特殊情况,当F的值为0时,首先全部累加到result48         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             else73             {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 }

 

HDOJ1009