EarthCup(二分图 hall定理)

文章描述了一个编程问题,其中涉及检查一个名为EarthCup的足球比赛的积分表是否被篡改。给定每支球队的最终积分,任务是确定这些积分是否可能根据比赛规则(每队比赛n-1场,平局后进行点球大战)产生,或者是否存在篡改。解决方案包括计算总比赛次数和按积分排序后的积分累加检查。
摘要由CSDN通过智能技术生成

2045年,世界杯足球赛逐渐被“地球超级杯”所取代(后面,简称为地球杯,EarthCup)。 一届EarthCupn 支(n≤50000)足球队参加。每两支队之间有一场比赛。这意味着每支球队都将与其他所有球队进行 n-1 场比赛。 为了使比赛结果清楚,规定如果比赛结束时两队打成平手,就进行点球大战,直到有结果为止。 在EarthCup上,每支球队都有一个积分,赢了一场就得一分,输了一场就得零分。得分最高的队将获得冠军。 2333年,有人发现,多年以来,一些球队雇佣黑客攻击和篡改EarthCup的数据,也许是因为球队数量太多,几百年来没有发现这种严重的作弊行为。 为了检查数据是否被修改,他们开始检查过去的“积分表”。 但由于年代久远,每队只保留最后的积分结果。没有人能记得每场比赛的确切结果。现在他们想找出肯定被篡改过的“积分表”。 “Must have been modified”意思是我们无法根据规则构造出每场比赛的结果,使得最后的积分表成立。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

输入说明

输入首先给出一个正整数 TT≤50),表示测试用例的数量。 对于每个测试用例,先给出一个正整数 n ,表示参加EarthCup的球队的数量。接下来的 n 行描述“积分表”,第 i 个整数ai​0≤ai<n)代表第 i 支球队的最终积分数。

输出说明

对于每个测试用例,如果积分表肯定被篡改,则输出“The data have been tampered with!”(不带引号);否则输出“It seems to have no problem.”(不带引号)。

平台会对你编写的代码进行测试:

测试输入:

2 3 2 1 0 3 2 2 2

预期输出: It seems to have no problem. The data have been tampered with!

提示: 对于第一个测试用例,一个可能的情况是:Team1Team2Team3,积2分;Team2Team3,但负于Team1,积1分;Team3两场比赛皆负,积0分。 对于第二个测试用例,显然不可能所有的球队都赢所有的比赛,所以积分表肯定被篡改,输入的 ai​ 是杂乱无章的。

试题来源:BestCoder Round #59 (div.1)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include<iomanip>
#include <queue>

using namespace std;

#define x first
#define y second
#define lowbit(x) ((x)&(-(x)))
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 1000005;
const double PI = acos(-1);

int a[50003];
int t,n;

void solve()
{
	memset(a,0,sizeof a);
	cin>>n;
    int tot=0;
    for(int i=1;i<=n;i++) 
    tot+=a[i];
    
    //先看看总数是不是目标值 
    if(tot != (n*(n-1)/2))
	{
		cout<<"The data have been tampered with!"<<endl;
		return;
	}    
    
    sort(a+1,a+n+1);int flag=0;
    int sum=0;
    
    //枚举从低到高 因为两两之间有对决 可以从低到高 看最低的积分有多少 很是否符合题意 在检查最后的合就行了 
    for(int i=1;i<=n;i++)
    {
		sum+=a[i];
		if(sum < i*(i-1)/2)
		{
			cout<<"The data have been tampered with!"<<endl;
			flag=1;
			break;
		}
	
	}
	
		if(flag==1) return;
		
		cout<<"It seems to have no problem."<<endl;  
}

signed main()
{
    std::ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    cin>>T;
    while(T--)
        solve();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值