牛客网Tournament
题目描述:
您正在安排比赛。 有 n 个球队。 每一对球队有 个比赛。 每天安排一场比赛。 对于每支球队,它将在第一场比赛举行的当天到达,并在最后一场比赛结束后离开。
例如,有3个团队,日程表是(1,2),(1,3),(2,3)。 一队将在第一天到达,在第二天离开。它将停留两天。 第二小组将停留三天。 第三队将停留两天。
求一个安排表,以减少他们停留的总天数。
分析:
这题首先想到的是暴力输出。
但是多校怎么会有这样的水题?
很显然WA了。
所以说一拍脑袋可以想到;
我们可以使用构造的方法:
1.把n支队伍分成n/2支队伍(标为A)n/2支队伍(标为B);
2.让A中队伍分别与A中队伍、B中队伍比赛,再让B中队伍与B中队伍比赛;
3.尝试在代码中分为4部分解决。
4.但是可以发现其实前面和中间的前半部分以及后面和中间的后半部分是可以合并的。
5.所以分两部分就行了
代码:

#include<cstdio> #include<algorithm> using namespace std; int main() { int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=2;i<n;i++) for(int j=1;j<=min(i-1,n-i);j++) printf("%d %d\n",j,i); for(int i=1;i<n;i++) { int k=min(i,n-i); for(int j=n-k+1;j<=n;j++) printf("%d %d\n",i,j); } } }