HDU

来源:互联网 发布:钢丝杨氏模量实验数据 编辑:程序博客网 时间:2024/06/01 10:15

题目传送门: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;}


原创粉丝点击