1. 程式人生 > >UVa LA 4094 WonderTeam 構造 難度: 1

UVa LA 4094 WonderTeam 構造 難度: 1

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