Skip to content

喵~ 主人,欢迎来到我的题解小课堂!今天我们要一起解决的是 Codeforces 上的一个问题:A. Goals of Victory。别看它好像和复杂的足球比赛有关,其实只要发现其中小小的奥秘,问题就会变得像撸猫一样简单哦!

题目大意

简单来说,就是有 n 支队伍参加一场足球锦标赛,每两支队伍之间都会比赛一次。

每场比赛结束后,我们只关心两队的进球数。一个队伍的 “效率值” 被定义为它在所有比赛中的 总进球数 减去 总被进球数(也就是总失球数)。

现在呢,Pak Dengklek 统计了 n-1 支队伍的效率值,但是他不小心忘记了最后一支队伍的效率值是多少。题目会给出 n 和这 n-1 个已知的效率值,需要我们找出那支被遗忘的队伍的效率值是多少。

题目保证答案是唯一的,不需要我们担心多种可能性,真贴心呀,喵~

题解方法

这个问题呀,乍一看可能会觉得需要模拟复杂的比赛过程,但其实完全不需要的说!这里有一个非常关键的性质,一旦发现,问题就迎刃而解啦。

让我们来定义一下效率值: 队伍 i 的效率值 E_i = (队伍 i 的总进球数) - (队伍 i 的总失球数)

现在,我们把所有 n 支队伍的效率值加起来,会发生什么奇妙的事情呢?

总效率值 = E_1 + E_2 + ... + E_n= (所有队伍的总进球数之和) - (所有队伍的总失球数之和)

关键点来咯!在这场锦标赛中,任何一个进球,都必然是一支队伍“进的”,同时是另一支队伍“丢的”。比如说,队伍A对队伍B踢了个 3-2,那么队伍A增加了3个进球,队伍B就增加了3个失球;同时队伍B增加了2个进球,队伍A就增加了2个失球。

所以,对于整个锦标赛来说,所有队伍的 总进球数 和所有队伍的 总失球数 肯定是完全相等的!

所有队伍的总进球数之和 = 所有队伍的总失球数之和

那么,我们上面那个总效率值的公式就变成了: 总效率值 = (某个值) - (同一个值) = 0

对啦!所有队伍的效率值之和永远是 !这是一个非常美妙的“零和”性质,喵~

既然知道了所有 n 个效率值的和是 0,而我们又已经知道了其中 n-1 个值的和(我们把它记作 S),那剩下的那个未知的效率值(我们记作 E_missing)不就很容易求出来了吗?

S + E_missing = 0E_missing = -S

所以,我们的解法就是:把所有已知的 n-1 个效率值加起来,然后取它的相反数,就是我们想要的答案啦!是不是超级简单呢?

题解

下面是实现这个思路的 C++ 代码,我已经加上了一些可爱的注释,方便主人理解哦~

cpp
#include <iostream>
#include <vector>
#include <numeric>

void solve() {
    int n;
    // 先读入有多少支队伍喵
    std::cin >> n;
    
    long long sum_of_known_efficiencies = 0;
    // 循环 n-1 次,把所有已知的效率值加起来
    for (int i = 0; i < n - 1; ++i) {
        int efficiency;
        std::cin >> efficiency;
        sum_of_known_efficiencies += efficiency;
    }
    
    // 根据我们的发现,所有效率值加起来等于0
    // 所以,那个被遗忘的家伙的效率值,就是已知总和的相反数~
    long long missing_efficiency = -sum_of_known_efficiencies;
    
    // 输出答案,然后换行,是个好习惯的说
    std::cout << missing_efficiency << "\n";
}

int main() {
    // 这两行是为了让输入输出快一点,对付大量数据时很有用哦
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    
    int t;
    // 读入测试用例的数量
    std::cin >> t;
    while (t--) {
        solve();
    }
    
    return 0;
}

知识点介绍

这个题目背后最核心的知识点就是 零和性质 (Zero-Sum Property)

在一个封闭的系统中,一方的收益必然意味着另一方的损失,所有参与者的收益和损失相加,总和永远为零。这就像我和我的猫咪朋友们分小鱼干,如果我多拿了一条,那肯定就有一位朋友少拿了一条,小鱼干的总数是不变的(除非被我偷偷吃掉了,喵呜~)。

在咱们这道题里:

  • 系统:就是这场有 n 支队伍的锦标赛。
  • “收益”和“损失”:可以看作是净胜球(效率值)。一支队伍的进球是它的“收益”,失球是它的“损失”。
  • 零和:因为每一个进球都对应一个失球,所以整个系统内的净胜球总和(也就是所有效率值的总和)必然为零。

这个思想在很多问题中都有应用,尤其是在博弈论、经济学和一些算法竞赛题中。当遇到一个问题,其中有多个参与者,并且他们的得分、损益等是相互关联的时候,不妨先思考一下,所有人的这些数值加起来会不会是一个恒定的值(比如0)。这常常能将一个复杂的问题简化成一个简单的数学计算题。

希望这次的讲解对主人有帮助喵!如果还有什么问题,随时可以再来找我玩哦~ Nya~

Released under the MIT License.