【NOIP第二轮模拟】 牛的杂技

【问题描述】
Farmer John养了N(1<=N<=50,000)头牛,她们已经按1~N依次编上了号。FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团的演出。可奶牛们很快发现她们那笨拙的蹄子根本无法在钢丝或晃动的的秋千上站稳(她们还尝试过把自己装在大炮里发射出去,但可想而知,结果是悲惨的)。最终,她们决定练习一种最简单的杂技:把所有牛都摞在一起,比如说,第一头牛站在第二头的身上,同时第二头牛又站在第三头牛的身上…最底下的是第N头牛。(牛果然没什么创造力)
每头牛都有自己的体重以及力量,编号为i的奶牛的体重为W_i(1<=W_i<=10,000),力量为S_i(1<=S_i<=1,000,000,000)。当某头牛身上站着另一些牛时它就会在一定程度上被压扁,我们不妨把它被压扁的程度叫做它的压扁指数。对于任意的牛,她的压扁指数等于摞在她上面的所有奶牛的总重(当然不包括她自己)减去它的力量。奶牛们按照一定的顺序摞在一起后,她们的总压扁指数就是被压得最扁的那头奶牛的压扁指数。你的任务就是帮助奶牛们找出一个摞在一起的顺序,使得总压扁指数最小。
【输入】
第1行: 一个单独的正整数N。
第2..N+1行: 第i+1行给出编号为i的奶牛的体重与力量W_i和S_i,用一个空格隔开。
【输出】
第1行: 一个整数,表示奶牛们总压扁指数的最小值。
【样例】
输入
3
10 3
2 5
3 3
输出
2
【说明】
把重量为10的那头牛放在最底下,于是她的压扁指数就是2+3-3=2。其他2头牛的压扁指数都小于这个值。


【分析】
此题与NOIP2012 国王游戏颇有几分神似,证明方式也不尽相同。比较任意两头牛交换位置,证明按照某种关键字排序,整个序列的值一定是最小的。

此题的优秀之处在于没有高精度且为简单的加法。
糟糕之处在于第一头牛也会被压扁,且压扁指数可以为负数

下方代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=50100;
struct node
{
    int w,s,c;
}p[maxn];
int n;
bool cmp(node x,node y)
{
    return x.c<y.c;
}
int main()
{
    freopen("acrobat.in","r",stdin);
    freopen("acrobat.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i].w>>p[i].s;
        p[i].c=p[i].w+p[i].s;
    }
    sort(p+1,p+n+1,cmp);
    int ans=-(1<<30),res=0;
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,res-p[i].s);
        res+=p[i].w;
    }
    cout<<ans;
    return 0;
}

如有不足之处,欢迎批评指正。

猜你喜欢

转载自blog.csdn.net/xyc1719/article/details/81133029