题目大意
有n个球队,每个球队都和其它所有球队比一场,所以一共有场比赛,每天一场比赛。
每个球队会在第一场比赛开始时到,最后一场比赛后走。
安排一个日程表,使所有球队停留的天数之和最小。
解题思路
最开始拿到题,由于样例的关系,还以为就是暴力输出全排列即可(发出了WA的声音)。
输入:
4
输出:
1 2
1 3
1 4
2 3
2 4
3 4
但是稍加思索,就会想到这样绝对不是最优安排。
假设我们有10个队,可以看到,我们的确照顾到了1号队,但是他们是比完9场就走了,而2,3,4,...,10号队都要挨个到来,要在场下白费好久。(而且1号队也是要看比赛的呀)
所以,我们要尽量地折中每个队伍的停留时间。
于是一拍脑袋,我们可以把n个队伍分成两半,得到这样的构造方法:
- 前一半互相比赛
- 前一半和后一半比赛
- 后一半互相比赛
详细操作就不赘述了,看代码:
AC代码(主函数)
int main() { int T,n,i,j; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=2;i<=n/2;i++) for(j=1;j<i;j++) printf("%d %d\n",j,i); for(i=n/2+1;i<n;i++) for(j=1;j<=n-i;j++) printf("%d %d\n",j,i); for(i=1;i<=n/2;i++) for(j=n-i+1;j<=n;j++) printf("%d %d\n",i,j); for(i=n/2+1;i<n;i++) for(j=i+1;j<=n;j++) printf("%d %d\n",i,j); } }