题意 有n头牛,每头牛有两个属性a,b 消灭这头牛要2a分钟,没被消灭的牛每分钟破环b个草草,求怎么排序会使得被破坏的草最少
思路 听了雨巨的课前只考虑两头牛的先后顺序,当时是从直觉判断贪心的正确,听了雨巨的课才知道,因为在整个序列中,交换两头牛对其他的牛没有影响,所以可以考虑根据两头牛的情况判断
假设有牛a b
情况一 a b 破环值为 2a.ab.b
情况二 b a 破坏值为 2b.aa.b
所以a.ab.b<b.a*a.b
即可 重点 long long!!
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int a,b;
}a[100010];
bool cmp(node a,node b)
{
return a.a*b.b<b.a*a.b;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].a>>a[i].b;
sort(a+1,a+1+n,cmp);
long long ans=0,now=0;
for(int i=1;i<=n;i++)
{
ans+=now*a[i].b;
now+=2*a[i].a;
}
cout<<ans<<endl;
}
京公网安备 11010502036488号