P1842 奶牛玩杂技

题目描述

题目链接

思路

这道题目知道结论是比较好写的,关键是结论是怎样推出来的。

我们先只考虑相邻的两个奶牛,设这两个奶牛为 \(a\)\(b\) ,这两个奶牛上面的奶牛总重量为 \(W\) ,所以我们考虑 \(a\) 在上面的情况和 \(b\) 在上面的情况。

\(a\) 在上面的情况:

\(a\) 的压扁指数为 \(W-S_a\)\(b\) 的压扁指数为 \(W+W_a-S_b\)

\(b\) 在上面的情况:

\(b\) 的压扁指数为 \(W-S_b\)\(a\) 的压扁指数为 \(W+W_b-S_a\)

我们如果想让 \(a\)\(b\) 的上面比 \(b\)\(a\) 的上面更优,就需要满足 \(\max(W-S_a,W+W_a-S_b) <\max(W-S_b,W+W_b-S_a)\)

但是直接比较是没有办法比较的。

让我们看一下由已知条件我们可以推出来什么。

\(W-S_a<W+W_b-S_a\) ,所以我们可以发现 \(W-S_a\) 不用和 \(W+W_b-S_a\)\(W-S_b\) 比较。因为我们设 \(W+W_b-S_a\)\(\max\) ,那么直接就可以得出结论。如果设 \(W-S_b\)\(\max\) ,那么就有 \(W-S_a<W+W_b-S_a<W-S_b\) 。所以 \(W-S_a<\max(W-S_b,W+W_b-S_a)\)

所以现在我们只需要让 \(W+W_a-S_b<\max(W-S_b,W+W_b-S_a)\) 就可以了。

\(W+W_a-S_b>W-S_b\) ,和上面的证明相似,我们可以证明 \(W-S_b<\max(W-S_a,W+W_a-S_b)\)

所以不论怎样 \(W+W_a-S_b\)\(W-S_b\) 是没有可能满足条件的,所以我们只能让

\[ \left\{ \begin{aligned} W+W_a-S_b<W+W_b-S_a \\ W-S_b<W+W_b-S_a \end{aligned} \right. \]

解得 $$S_a+W_a<S_b+W_b$$

Code

#include<bits/stdc++.h>
#define pii pair<ll,ll>
#define mp make_pair
#define one first
#define two second
#define ll long long
using std::sort;
using std::pair;
using std::max;
using std::mp;
const int N=5e4+100;
const ll INF=9223372036854775807;
int n;
ll maxx=-INF;
pii id[N];
ll sum[N];
inline bool cmp(pii a,pii b) {return a.one+a.two<b.one+b.two;}
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	scanf("%lld%lld",&id[i].one,&id[i].two);
	sort(id+1,id+n+1,cmp);
	for (int i=1;i<=n;i++)
	{
		maxx=max(maxx,sum[i-1]-id[i].two);
		sum[i]=sum[i-1]+id[i].one;
	}
	printf("%lld\n",maxx);
	return 0;
}
posted @ 2019-10-21 08:15  准点的星辰  阅读(101)  评论(0编辑  收藏  举报