杭电ACM——1009,FatMousesTrade(贪心)

贪心算法。按每个屋子的性价比高低进行排序。即创建一个数组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[j]) k=j;
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;
}

虽然,这道题思路并不会很难确定,但还是有很多注意点,稍微疏忽就有可能报错,因此,思考之时务必仔细,思考可能出现的情况。

猜你喜欢

转载自blog.csdn.net/shamansi99/article/details/86797726