题目链接:HDU1009
题目是一道简单的贪心问题,但是一点需要注意:
排序kase[i].j/kase[i].f的时候需要考虑kase[i].f为0的情况,也就是说代价为0,此时比值应该为无穷大,但是j,f二者皆为double型变量,比值在f极小的情况下也可以接近无穷大,如果置j=0时比值为一个很大的值如 1e9,也不能满足条件。故考虑将j=0单独拿出来考虑,仅对j!=0的情况进行贪心。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define INF 1e50
#define maxn 1000
struct warehouse
{
double f,j,unit_price;
}Kase[maxn];
bool cmp(warehouse x,warehouse y)
{
if(x.unit_price>=y.unit_price) return true;
else return false;
}
int main()
{
double m;int n;
while(scanf("%lf%d",&m,&n))
{
if(m==-1&&n==-1)break;
double sum=0;
int i,k;
for(k=i=0;i<n;i++)
{
scanf("%lf%lf",&Kase[k].j,&Kase[k].f);
if(Kase[k].j){Kase[k].unit_price=Kase[k].j/Kase[k].f;k++;}
else {sum+=Kase[k].j;}
}
sort(Kase,Kase+k,cmp);
double left=m;
for(int i=0;i<k;i++)
{
if(left>=Kase[i].f)
{
left-=Kase[i].f;
sum+=Kase[i].j;
}
else
{
sum+=(double)left/Kase[i].f*Kase[i].j;
left=0;break;
}
}
printf("%.3lf
",sum);
}
}