zoj 2109 || hdoj1009 FatMouse' Trade(贪心)

题意:

M  N

J[i]  F[i]

fatmouse有M克猫粮(类似吧),现在有个房间,F[i]  pounds 猫粮 可以换 J[i] pounds javabeans.

(hdoj的discuss里有句话很搞:“在我查过大量的资料后,终于明白了,JavaBean是一种爪哇产的咖啡豆,肥鼠怎么可能喜欢吃这种东西...........”)


分析:

果断贪心,按照j/f 排序。WA了几次,还是因为思考问题不严密啊,真的要有意识地加强。严谨!!!.

1 0 和

0 1

1 0

这两组数据过不了,然后就断网了。继续把情况考虑了下.早上很早就起来交上去试试,结果行了。哎,郁闷。学姐也发给我一份她改过的,没考虑特殊情况,

只不过在判断条件上我用

if(M>a[i].f) 
然后她是加了个=。这样就可以了。>_<
偶的丑代码:
 
#include <iostream>
#include <cstdio>
using namespace std;
typedef struct p{
    int j,f;
    double d;
}point;
int main()
{
    int M,N;
    int i,j;
    double ff,res;
    point a[1005],temp;
    while(~scanf("%d%d",&M,&N))
    {
        if(M==-1&&N==-1) break;
        res=0;
        if(N==0) printf("%.3f\n",res);
        for(i=0;i<N;i++)
        {
            cin>>a[i].j>>a[i].f;
            a[i].d=(double)a[i].j/a[i].f;
        }
        for(i=0;i<N;i++)
        {
            for(j=i;j<N;j++)
            {
                if(a[i].d<a[j].d)
                {
                    temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
            }
        }
        for(i=0;i<N;i++)
        {
            if(M>a[i].f) 
            {
                res+=a[i].j;
                M-=a[i].f;
                if((i>=N-1&&M>0)||M==0) {printf("%.3f\n",res);break;}
            }
            else if(M<=a[i].f)
            {
                ff=(double)a[i].j/a[i].f;
                if(a[i].f==0) res+=a[i].j;
                else 
                res+=ff*M;
                printf("%.3f\n",res);
                break;
            }
        }
    }
        return 0;
}
学姐的:
#include <iostream>
#include <cstdio>
using namespace std;
typedef struct p{
	int j,f;
	double d;
}point;
int main()
{
	int M,N;
	int i,j;
	double res;
	point a[1005],temp;
	while(~scanf("%d%d",&M,&N))
	{
		if(M==-1&&N==-1) break;
		res=0;
		for(i=0;i<N;i++)
		{
			cin>>a[i].j>>a[i].f;
			a[i].d=(double)a[i].j/a[i].f;
		}
		for(i=0;i<N;i++)
		{
			for(j=i;j<N;j++)
			{
				if(a[i].d<a[j].d)
				{
					temp=a[i];
					a[i]=a[j];
					a[j]=temp;
				}
			}
		}
		for(i=0;i<N;i++)
		{
			if(M>=a[i].f)//条件注意
			{
				res+=a[i].j;
				M-=a[i].f;
				if(M==0)
					break;
			}
			else if(M<a[i].f)
			{
				res+=a[i].d*M;
				break;
			}
		}
		printf("%.3f\n",res);
	}
		return 0;
}

 

你可能感兴趣的:(zoj 2109 || hdoj1009 FatMouse' Trade(贪心))