BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花

来源:互联网 发布:java中this 编辑:程序博客网 时间:2024/05/16 13:59

嗯 这题的话 如果研究一下相邻的两个 看看交换的结果就好 好像是一种很经典的方法啊、、

如果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;}

1 0