HDU贪心题解

来源:互联网 发布:天下数据员工 编辑:程序博客网 时间:2024/05/21 12:42

HDU1009FatMouse' Trade

解法1:这里用冒泡排序完成#include<iostream>#include<algorithm>using namespace std;int main(){int a,b,c,i,l;double sum;int  j[1010],f[1010];double k[1010],d;while(scanf("%d%d",&a,&b)!=EOF){if(a==-1&&b==-1)break;sum=0;for(i=0;i<b;i++){cin>>j[i]>>f[i];k[i]=j[i]*1.0/f[i];}  for(i=0;i<b;i++)  {  for(l=i;l<b-i-1;l++)  {  if(k[l]>k[l+1])  {   c=j[l];j[l]=j[l+1];j[l+1]=c;   c=f[l];f[l]=f[l+1];f[l+1]=c;   d=k[l];k[l]=k[l+1];k[l+1]=d;  }  }  }  int temp=a;  for(i=b-1;i>=0;i--)  {  temp=temp-f[i];  if(temp>=0) sum=sum+j[i];  else{   sum=sum+(temp+f[i])*k[i]; break;    }   }//排完序如何计算也是关键  printf("%.3f\n",sum);  }return 0;} 

解法2:

#include<iostream>#include<algorithm>using namespace std;struct Node{    double j,f,p;}node[1000];int cmp(Node x,Node y){    return x.p>y.p;}int main(){       int n,m;      while(scanf("%d%d",&n,&m)!=EOF&&(m!=-1||n!=-1))      {          double sum=0;          int i;        for(i=0;i<m;i++)        {            scanf("%lf%lf",&node[i].j,&node[i].f);            node[i].p=node[i].j/node[i].f;        }        sort(node,node+m,cmp);           for(int i=0;i<m;i++)         {              if(node[i].f<n)              {                  sum=sum+node[i].j;                  n=n-node[i].f;              }              else              {                  sum=sum+node[i].p*n;                  break;              }         }         printf("%.3lf\n",sum);     }   return 0;} 



1 0
原创粉丝点击