首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。