UVa LA 4094 WonderTeam 構造 難度: 1
阿新 • • 發佈:2019-04-13
int scanf 球隊 namespace problem 結果 () == 得到
題目
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2095
題意
球賽,n個球隊,每兩個之間賽兩場,勝得三分,平得1分。夢之隊是勝利場數最多的隊伍,問夢之隊的最低排名。
思路
明顯,可以令夢隊和其他隊伍都相差1個勝局。
那麽不妨幹脆設夢隊勝局為2,其他隊伍勝局數為1
由於每個隊伍只能參與2n-2場比賽,讓情況盡可能對夢隊不利,也就是其他隊伍的勝局都來自於夢隊,同時其他隊伍之間的比賽都是平局
夢隊參與的勝局,平局,輸局為 2, n - 3, n - 1,總分為n + 3
一般隊伍與夢隊平局,勝局,平局,輸局為 1, 2n - 3, 0,總分為2n
差隊伍輸給了夢隊,勝局,平局,輸局為 1, 2n - 4, 1,總分為2n - 1。
那麽何時夢隊的結果比一般隊伍差? n + 3 < 2n,得到 n > 3
何時夢隊結果比差隊伍還差?n + 3 < 2n - 1,得到n > 4
也就是說
n <= 3,夢隊最低也是第一名
n == 4,夢隊最低是第二名,因為此時一般隊伍有4 - 2 - 1 = 1個。
n >= 5, 夢隊可能是最後一名。
感想
1. 讀完題目之後不知為何心中堅定認為夢之隊前面只能有第一名,也就是說夢之隊前面的隊伍得分是一樣的,為此怎麽構造也構造不出來
代碼
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1e3 + 3; typedef pair<int, int> Pair; int n; int main() { int T; //scanf("%d", &T); freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\input.txt", "r", stdin); //freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\output.txt", "w", stdout); for (int ti = 1; scanf("%d", &n) == 1 && n; ti++) { if (n < 4)puts("1"); else if (n == 4) puts("2"); else { printf("%d\n", n); } } return 0; }
UVa LA 4094 WonderTeam 構造 難度: 1