喵~ 主人,欢迎来到我的题解小课堂!今天我们要一起解决的是 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 = 0
E_missing = -S
所以,我们的解法就是:把所有已知的 n-1
个效率值加起来,然后取它的相反数,就是我们想要的答案啦!是不是超级简单呢?
题解
下面是实现这个思路的 C++ 代码,我已经加上了一些可爱的注释,方便主人理解哦~
#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~