首先先看懂题目,然后对题目要有深入理解,知道考查的是贪心算法。
题意:老鼠要去用猫食去换java豆,每个房间有一定的豆和猫食,J[i] and F[i] ,这既是每个房间的上限,也是兑换比率。
所以,用a[i] = j[i]/f[i]表示比率,按照比率对三项进行从大到小的排序(其实此处用结构体听简便的),然后从第一项,开始逐项对得到的豆和猫粮进行累加,直到猫粮在最后一次兑换时不够用时,最后一次单独考虑。
重要的几种测试数据:
0 1 1 0 1.000 1 0 0.000
代码如下:
#include<stdio.h>
void Swap(double *one,double *two)
{
double t;
t = *one;
*one = *two;
*two = t;
}
int main()
{
double j[1000],f[1000],a[1000],s,c;
int i,m,n,k;
while(~scanf("%d%d",&m,&n))
{
if(m==-1&&n==-1)
break;
if(n==0)
{
printf("0.000\n");
continue;
}
for(i=0;i<n;i++)
{
scanf("%lf%lf",&j[i],&f[i]);
a[i] = j[i]/f[i];//猫粮换豆的比率
}
for(i=0;i<n-1;i++)//冒泡排序
{
for(k=0;k<n-i-1;k++)
{
if(a[k]<a[k+1])
{
Swap(&j[k],&j[k+1]);
Swap(&f[k],&f[k+1]);
Swap(&a[k],&a[k+1]);
}
}
}
s=0;
c=0;
for(i=0;i<n;i++)
{
s+=j[i];//豆
c+=f[i];//猫粮
if(c > m)//猫粮不够用的时候
break;
}
s += a[i]*(double)(m - c + f[i]) -j[i];
printf("%.3lf\n",s);
}
}
题目:
5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
13.333 31.500