UVALive-7601 Football(思维)

来源:互联网 发布:清除电脑垃圾的软件 编辑:程序博客网 时间:2024/05/16 13:43

传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5623

题意:有n个球队,分别要与其他所有队进行一场比赛,即每个球队要进行n-1场比赛,胜者得1分,败者0分,现在给出这n个队的得分情况,问得分是否正确

题解:①先将得分从小到大排序,对于第i个球队,得分为x,假如有i-1分是从前i-1个球队中得到,那么还剩x-i+1分要从后面的队伍中得到(注意可以为负数,如果为负数则表示让这个球队再多输|x-i+1|场,并且是输给前i-1个队伍中的某些队伍,这样就可以进行逆推,因为不会对后面造成影响);②再逆推,先看第n个球队,如果a[n]>0,就表示第n个球队赢得的分数超过了n-1显然错误;如果a[n]==0,表示恰好赢了n-1场;如果a[n]<0,表示还应再输|a[n]|场.因此维护一个后缀和:a[i]表示第i个队伍到第n个队伍的得分和,如果a[i]>0,表示不能从后面的队伍得到足够的分数而又不能从前面的队伍得分,那么得分错误;③最后如果a[1]==0,则得分正确


#include<cstdio>#include<algorithm>#include<string.h>using namespace std;int a[10005];int main(){    int n;    while(~scanf("%d",&n)){        int flag=1;        memset(a,0,sizeof(a));        for(int i=0;i<n;i++) {            scanf("%d",&a[i]);            if(a[i]>=n||a[i]<0) flag=-1;        }        sort(a,a+n);        for(int i=0;i<n;i++) a[i]-=i;        for(int i=n-1;i>=0;i--){            a[i]+=a[i+1];            if(a[i]>0) flag=-1;        }        if(a[0]!=0) flag=-1;        printf("%d\n",flag);    }    return 0;}




0 0
原创粉丝点击