今天重新翻出了HDU的ACM Steps中的题目做了一下,发现一道比较简单的题目。
题目链接: 题目
题目的思路大致可以分为两个部分:
第一部分:将每个房间中JavaBeans和cat food的比例(精确到小数点后三位)分别求出来并存在一个数组之中,并将这个数组进行从大到小的排序。
第二部分:对排序好的数组从大到小,依次累加其对应的JavaBeans的数量直至cat food不足以付出一个房间的cat food要求,再用之前的比例进行计算,统计所得到的所有JavaBeans的数量。
代码如下:
#include <stdio.h>
struct c{
int j;
int u;
double k;
};
void sort(struct c *a, int left, int right)
{
if(left >= right)
return;
int x = left;
int y = right;
double key = a[left].k;
double key1 = a[left].j;
double key2 = a[left].u;
while(x<y)
{
while(x<y && key <= a[y].k)
{
y--;
}
a[x].j=a[y].j;
a[x].u=a[y].u;
a[x].k=a[y].k;
while(x<y && key >=a[x].k)
{
x++;
}
a[y].j=a[x].j;
a[y].u=a[x].u;
a[y].k=a[x].k;
}
a[x].j = key1;
a[x].u = key2;
a[x].k = key;
sort(a, left, x - 1);
sort(a, x+1, right);
}
struct c f[1000];
int main()
{
int m,n,i;
int a,b;
while(scanf("%d %d",&m,&n)!=EOF && m!=-1 && n!=-1)
{
double count=0;
for(i=1;i<=n;i++)
{
scanf("%d %d",&a,&b);
f[i].j=a;
f[i].u=b;
f[i].k=(double)a/b;
}
sort(f,1,n);
for(i=n;i>=1;i--)
{
if(m >= f[i].u)
count+=f[i].j;
else
{
count=count+f[i].k*m;
break;
}
m-=f[i].u;
}
printf("%.3f\n", count);
}
return 0;
}
仔细想想,应该还有更简便的方法,期待下次能更新~