贪心算法。按每个屋子的性价比高低进行排序。即创建一个数组val[]=j[i]/f[i]
特别注意:
1.j[i]=0的情况;
2.f[i]=0的情况;
3.数据的类型。
#include<cstdio>
using namespace std;
double j[1005],f[1005],val[1005]; //注意,都要定义为浮点型,因为val[]=j[i]/f[i],性价比不一定为整数
void sort(int n)
{
int i,j1,k;
for(i=0;i<=n-2;i++)
{
k=i;
for(j1=i+1;j1<=n-1;j1++) //按性价比从大到小排序
if(val[k]<val[j1]) k=j1;
if(k!=i)
{
double t; //***这点也要特别小心,要是定义成int型,数据的转换就会发生错误,一定WA***
t=val[i];val[i]=val[k];val[k]=t;
t=j[i];j[i]=j[k];j[k]=t;
t=f[i];f[i]=f[k];f[k]=t;
}
//printf("%.3lf %.3lf %.3lf\n",j[i],f[i],val[i]);
}
}
int main()
{
int M,N;
int i;
double sum; //表示最终所得的鼠粮总量
for(;;)
{
sum=0;
scanf("%d %d",&M,&N);
if(M==-1&&N==-1) break;
for(i=0;i<=N-1;i++)
{
scanf("%lf %lf",&j[i],&f[i]);
if(j[i]==0) val[i]=-1; //j[i]=0,性价比最低,定义为-1
else if(f[i]==0) val[i]=1001; //f[i]=0,性价比无穷大,定义为1001
else val[i]=j[i]/f[i]; //可以理解为什么要把j[i],f[i]定义为浮点型了吧
}
sort(N);
for(i=0;i<=N-1;i++)
{
if(M==0) break; //***没有可以换的猫粮时,直接结束(注意,这点也很重要!)***
if(val[i]>0) //跳过那些j[i]=0的房间,毕竟,谁换拿手里的东西去换空气呢
{
if(f[i]<=M)
{
sum=sum+j[i];
M=M-f[i];
}
else
{
sum=sum+j[i]*(double)M/f[i];// printf("%lf\n",(double)M/f[i]); dig bug
M=0; //上式有一点要注意,就是***要进行强制类型转换***,否则, 可能出错
}
}//printf("%d M %.3lf _ \n",M,sum); dig bug
}
printf("%.3lf\n",sum);
}
return 0;
}
虽然,这道题思路并不会很难确定,但还是有很多注意点,稍微疏忽就有可能报错,因此,思考之时务必仔细,思考可能出现的情况。