Football Games HDU - 5873(兰道定理)

博客围绕足球比赛HDU - 5873题展开,比赛中每两支球队都要比一场,赢、输、平分别对应2、0、1分。题目给定球队比分情况,判断其是否合法。分析时起初用简单条件判断通过,后发现兰道定理是正解,可据此判断比分序列合法性。

Football Games HDU - 5873

A mysterious country will hold a football world championships—Abnormal Cup, attracting football teams and fans from all around the world. This country is so mysterious that none of the information of the games will be open to the public till the end of all the matches. And finally only the score of each team will be announced.

At the first phase of the championships, teams are divided into M
groups using the single round robin rule where one and only one game will be played between each pair of teams within each group. The winner of a game scores 2 points, the loser scores 0, when the game is tied both score 1 point. The schedule of these games are unknown, only the scores of each team in each group are available.

  When those games finished, some insider revealed that there were some false scores in some groups. This has aroused great concern among the pubic, so the the Association of Credit Management (ACM) asks you to judge which groups' scores must be false. 

Input
Multiple test cases, process till end of the input.

  For each case, the first line contains a positive integers M, which is the number of groups.

The i-th of the next M lines begins with a positive integer Bi representing the number of teams in the i-th group, followed by Bi
nonnegative integers representing the score of each team in this group.

number of test cases <= 10
M<= 100
B[i]<= 20000
score of each team <= 20000

Output
For each test case, output M
lines. Output F" (without quotes) if the scores in the i-th group must be false, outputT” (without quotes) otherwise. See samples for detail.
Sample Input

2
3 0 5 1
2 1 1

Sample Output

F
T
题意:

有B支足球队,每两支队伍都要比一场,赢了得2分,输了得0分,平局双方各得1分。

每次给定B个球队的比分情况问是否合法

分析:

当时看做出来的时候感觉不明觉历,随随便便找了几个条件,看是否满足,但是总感觉还差点什么结果就过了

之后搜题解大部分又都说是思维题模拟题,但是却发现兰道定理这个奇妙的东西,恰好就是这个问题的正解

兰道定理:

兰道定理又称竞赛图定理,是一个定义在有向图上的概念,顾名思义,它可以想象成n个人两两对决,赢得向输的连边,其实就是给一副完全图的无向边定了方向。

定义一个竞赛图的比分序列(score sequence),是把竞赛图的每一个点的出度从小到大排列得到的序列。(这里相当于赢一句得1分)
一个长度为n的序列s=(s1s2...sn),n1s=(s1≤s2≤...≤sn),n≥1,是合法的比分序列当且仅当:

1kn,i=1ksi(k2)∀1≤k≤n,∑i=1ksi≥(k2)

k=nk=n时这个式子必须取等号

因此我们直接按照这个式子判断就行了,只不过这道题目赢一句得2分,因此给(k2)(k2)乘2就行了

code:

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 20010;
int a[MAXN];
int main(){
    int t;
    while(scanf("%d",&t) != EOF){
        while(t--){
            memset(a,0,sizeof(a));
            int n,i,sum = 0;
            bool flag = true;
            scanf("%d",&n);
            for(int i = 0; i < n; i++){
                scanf("%d",&a[i]);
                sum += a[i];
            }
            if(sum != n*(n-1)){
                flag = false;
                puts("F");
                continue;
            }
            sort(a,a+n);
            sum = 0;
            for(int i = 0; i < n-1; i++){
                sum += a[i];
                if(sum >= (i + 1) * i) continue;
                else{
                    flag = false;
                    puts("F");
                    break;
                }
            }
            if(flag) puts("T");
        }
    }
    return 0;
}
### 关于HDU - 6609 的题目解析 由于当前未提供具体关于 HDU - 6609 题目的详细描述,以下是基于一般算法竞赛题型可能涉及的内容进行推测和解答。 #### 可能的题目背景 假设该题目属于动态规划类问题(类似于多重背包问题),其核心在于优化资源分配或路径选择。此类问题通常会给出一组物品及其属性(如重量、价值等)以及约束条件(如容量限制)。目标是最优地选取某些物品使得满足特定的目标函数[^2]。 #### 动态转移方程设计 如果此题确实是一个变种的背包问题,则可以采用如下状态定义方法: 设 `dp[i][j]` 表示前 i 种物品,在某种条件下达到 j 值时的最大收益或者最小代价。对于每一种新加入考虑范围内的物体 k ,更新规则可能是这样的形式: ```python for i in range(n): for s in range(V, w[k]-1, -1): dp[s] = max(dp[s], dp[s-w[k]] + v[k]) ``` 这里需要注意边界情况处理以及初始化设置合理值来保证计算准确性。 另外还有一种可能性就是它涉及到组合数学方面知识或者是图论最短路等相关知识点。如果是后者的话那么就需要构建相应的邻接表表示图形结构并通过Dijkstra/Bellman-Ford/Floyd-Warshall等经典算法求解两点间距离等问题了[^4]。 最后按照输出格式要求打印结果字符串"Case #X: Y"[^3]。 #### 示例代码片段 下面展示了一个简单的伪代码框架用于解决上述提到类型的DP问题: ```python def solve(): t=int(input()) res=[] cas=1 while(t>0): n,k=list(map(int,input().split())) # Initialize your data structures here ans=find_min_unhappiness() # Implement function find_min_unhappiness() res.append(f'Case #{cas}: {round(ans)}') cas+=1 t-=1 print("\n".join(res)) solve() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值