题解 | #Protecting the Flowers#
Protecting the Flowers
https://ac.nowcoder.com/acm/problem/25043
题意 有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; }