嗯 这题的话 如果研究一下相邻的两个 看看交换的结果就好 好像是一种很经典的方法啊、、
如果x后拿的多一点 2Tx*Dy<=2Ty*Dx 所以当Dy/Ty<=Dx/Tx时 x应该在y前面被拿
排序一下就好了
Code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long LL;
inline int read()
{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
struct node{int x,y;double c;}a[100005];
int Cmp(node x1,node x2){return x1.c>x2.c;}
int main()
{
int i,j,n=read();
for(i=1;i<=n;i++)
{
a[i].x=read(),a[i].y=read();
a[i].c=double(a[i].y)/a[i].x;
}
sort(a+1,a+1+n,Cmp);
LL t=0,ans=0;
for(i=1;i<=n;i++)
{
ans+=a[i].y*t;
t+=2*a[i].x;
}
printf("%lld\n",ans);
return 0;
}