poj3262

正确的应该按照D/T从大到小排序。

证明如下:

任取两头牛i和j,这两头牛需要的总时间为2*(Ti+Tj),在此时间中其他牛吃的花是一定的,因此只要考虑这两头牛就可以了。

若先送牛i,则牛j吃掉的花为2*(Ti*Dj),若先送牛j,则牛i吃掉的花为2*(Tj*Di),我们只要在两者里取个小的就可以了。

注意到T,D是大于0的,因此只要在DJ/TJ和DI/TI里取一个小的。

证毕。

#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
	int t;
	int  d;
	//int state;
};
int cmp(node a ,node b)
{
	return a.d*1.0/a.t > b.d*1.0 /b.t;
}
node a[100005];
int n;
/*int count(int i)
{
	int j;
	int sum=0;
	for(j=0;j<n;j++)
	{
		if(j!=i && a[j].state==0)
			sum=sum+a[j].d;
	}
	return sum;
}*/
int main()
{

	int i;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i].t>>a[i].d;
//	for(i=0;i<n;i++)
	//	a[i].state=0;
	sort(a,a+n,cmp);
	long long sum=0;
	long  long tt=0;
	for(i=0;i<n;i++)
	{
		sum=sum+tt*a[i].d;
		tt=tt+2*a[i].t;////good,相比于自己写的少了一重循环
	}
	cout<<sum<<endl;
	return 0;
}

  坑爹的VC6.0,long long 型在VC6.0中居然不支持,还是codeblocks好使啊

posted on 2012-05-25 16:20  矮人狙击手!  阅读(277)  评论(0编辑  收藏  举报

导航