这道题的解法体现生活——买东西买性价比高的。
P.S. 总有一些小地方让你WA==!为什么总是用non-negative来摧残人?
/*
* hdu-1009
* mike-w
* 2012-4-8
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 11111
#define INF (2<<20)
#define ONLINE_JUDGE
typedef struct _item
{
int java,cat;
double price;
}item;
int N,M;
item f[MAX_SIZE];
int comp(const void *e1, const void *e2)
{
double d=((item*)e1)->price - ((item*)e2)->price;
if(d>0)
return -1;
else if(d<0)
return 1;
else
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i;
double amount,money;
while(scanf("%d%d",&M,&N),M>=0)
{
for(i=0;i<N;i++)
{
scanf("%d%d",&(f[i].java),&(f[i].cat));
if(f[i].cat==0)
f[i].price=(double)INF;
else
f[i].price=(double)f[i].java/(double)f[i].cat;
}
/* a cut */
if(M==0 || N==0)
{
printf("0.000\n");
continue;
}
/* find answer */
qsort(f,N,sizeof(item),comp);
amount=0;
money=(double)M;
for(i=0;i<N && money>0;i++)
{
if(money>=f[i].cat) /* buy all */
money-=f[i].cat,amount+=f[i].java;
else /* buy part */
amount+=f[i].java*(money/f[i].cat),money=0.0;
}
printf("%.3lf\n",amount);
}
return 0;
}