题解 POJ3045 【Cow Acrobats】
题目链接:Link
Problem
Solution
首先,我们可以发现:交换相邻的两头奶牛,对其它奶牛的危险值没有影响。设这两头奶牛分别为\((s_1,w_1),(s_2,w_2)\),之前所有奶牛的体重和为\(sw\),则1放在2前面更优意味着:
\[max(sw-s_1,sw+w_1-s_2) < max(sw-s_2,sw+w_2-s1)
\]
继续化简:
\[max(-s_1,w_1-s_2) < max(-s_2,w_2-s1)
\]
两边同加 $ s_1 + s_2 $:
\[max(s_2,w_1+s_1) < max(s_1,w_2+s_2)
\]
由于$ s_1,s_2,w_1,w_2 $都为正整数,所以 $ s_2 < max(s_1,w_2+s_2) , s_1 < max(w_1+s_1) $,因此 $ s_2,s_1 $对不等式是否成立没有影响,所以:
\[w_1+s_1 < w_2+s_2
\]
然后就可以套用临项交换的模板了。
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=50005;
struct COW { int w,s; };
int n; COW co[maxn];
inline bool operator<(const COW &a,const COW &b) { return a.w+a.s<b.w+b.s; }
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&co[i].w,&co[i].s);
sort(co,co+n);
LL sum=0,res=-1e9;
for(int i=0;i<n;i++)
{
if(sum-co[i].s>res) res=sum-co[i].s;
sum+=co[i].w;
}
printf("%lld\n",res);
return 0;
}
本作品由happyZYM采用知识共享 署名-非商业性使用-相同方式共享 4.0 (CC BY-NC-SA 4.0) 国际许可协议(镜像(简单版)镜像(完整版))进行许可。
转载请注明出处:https://www.cnblogs.com/happyZYM/p/11380081.html (近乎)全文转载而非引用的请在文首添加出处链接。