洛谷题解 P1842 【奶牛玩杂技】
Oh,可怜的奶牛
开始说正题 :
猜测:(注:这只是一种形象的说法)
与重量和力量都有关,再分析样例,发现是重量+力量。
- 若w值较大,则将其放在最下方,不让它压其他牛;
- 若s值较大,则将其放在最下方,承受其他牛的压力。
证明:设有a和b两头相邻的牛 (a在下,b在上) 文中W为重量总和
设 \(Wa+Sa<Wb+Sb\)
即 \(Wa-Sb<Wb-Sa\)
\(W-Sb<W+Wa-Sb\)
\(W-Sa<W+Wb-Sa\)
发现:\(W+Wa-Sb<W+Wb-Sa\)
显然,在\(Wa+Sa<Wb+Sb\)的情况下,选择b在下,a在上。方案更优。
综上所述,将 W+S 值大的牛放在下方即可。
注意结果有可能是负数(不然60分)(本菜已被坑)
现将本蒟蒻的代码献上
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node { int w,s,data,k; } a[50005];
bool cmp(node a,node b) { return a.data>b.data; }
int main() {
int n,Max,zw=0;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i].w>>a[i].s;
a[i].data=a[i].w+a[i].s;
zw+=a[i].w;
}
sort(a+1,a+n+1,cmp);
zw-=a[1].w;
a[1].k=zw-a[1].s;
Max=a[1].k;
for(int i=2;i<=n;i++) {
zw-=a[i].w;
a[i].k=zw-a[i].s;
Max=max(Max,a[i].k);
}
cout<<Max;
return 0;
}