首页 > 编程学习 > UVALive-7601 Football(思维)

UVALive-7601 Football(思维)

发布时间:2022/12/10 17:13:46

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





本文链接:https://www.ngui.cc/el/2314510.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000