HDU - 4567 Brilliant Programmers Show 2013长沙邀请赛

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4567


写在前面:这道题题目数据有问题,第40组以后的数据没有任何输出,也不知道是哪位大神发现的,反正就是这样...


题意:有一队人,相邻的两个人中排名靠后的可以向排名靠前的挑战,如果挑战成功,他们排名互换,现在已知初始各排名的人发起挑战的次数,问你是否合理,如果合理能否确定冠军


分析:首先对于在每个位置的人来说,实际挑战次数记为t[i],他们都有一个最大可能的挑战次数,我们记为m[i],其中包括在他前面的人的挑战次数a[i],其中a[i]=a[i-1]+t[i]+1,和在他后面的人的挑战次数b[i],既然是最大的挑战次数,那么所有的人必定和他轮番交战,尽量拖延次数,所以如果t[i]==m[i],那么他就是冠军,如果t[i]>m[i],那么这是不合理的,如果每个人的t[i]<m[i],冠军是不确定的,但是如果每个人都去判断的话时间为O(n^2),超过了要求,所以根据题意我们选择最后一个t[i]>=a[i]的人序号为k,证明如下:t[i]<a[i]的人,t[i]一定小于m[i],不考虑,t[i]>=a[i]但序号h<k,则k一个人就可以去和h相互轮换直至结束,所以只要考虑最后一个数k即可。


代码:

#include <bits/stdc++.h>

using namespace std;

int n,ca,flag,t;
long long a[1000005],sum[1000005],t1,t2;

int main()
{
    ios::sync_with_stdio(false);
    ca=0;
    while(cin>>n)
    {
        ca++;
        sum[0]=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum[i]=a[i]+sum[i-1]+1;
        }
        if(ca>=40)
            continue;
        t=0;
        for(int i=1;i<=n;i++)
            if(a[i]>=sum[i-1])
                t=i;
        t1=t2=0;
        for(int i=t+1;i<=n;i++)
        {
            if(a[i]<=t1)
                t1++;
            else
                t2+=a[i]-t1;
        }
        if(a[t]>sum[t-1]+t2)
            cout<<"Bad Rescue"<<endl;
        else if(a[t]==sum[t-1]+t2)
            cout<<t<<endl;
        else
            cout<<"Unknown"<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值