P1842 奶牛玩杂技

Posted last-diary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1842 奶牛玩杂技相关的知识,希望对你有一定的参考价值。

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{ egin{aligned} W+W_a-S_b<W+W_b-S_a W-S_b<W+W_b-S_a end{aligned} ight. ]

解得 [S_a+W_a<S_b+W_b]

#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
",maxx);
    return 0;
}

以上是关于P1842 奶牛玩杂技的主要内容,如果未能解决你的问题,请参考以下文章

题解[USACO05NOV]奶牛玩杂技

迭奶牛

1621:轻拍牛头

Graham's Scan法求解凸包问题

[BZOJ1690][Usaco2007 Dec]奶牛的旅行

BZOJ 1690 Usaco2007 Dec 奶牛的旅行