题意
- 链接:Tournament
- 给出一个数n,请你安排n个队相互之间互打共n(n-1)/2场比赛,一天一场,每个队在需参加的最早的那场进场需参加的最晚的那场退场,问怎么安排才能使他们待的总时间最少
解题思路
- 由于每个队在需参加的最早的那场进场需参加的最晚的那场退场,而又要使他们待的总时间最少,所以要使大家的等待时间均匀分配,所以就要分成三个部分
- 前半部分互打
- 前半部分与后半部分对打
需要注意使后半部分进场均匀,前半部分退场均匀 - 后半部分互打
- 前半部分互打
- 前半部分与后半部分对打,后半部分进场均匀
- 前半部分与后半部分对打,前半部分退场均匀
u | v |
---|
1 | 10 |
2 | 9 |
2 | 10 |
3 | 8 |
3 | 9 |
3 | 10 |
4 | 7 |
4 | 8 |
4 | 9 |
4 | 10 |
5 | 6 |
5 | 7 |
5 | 8 |
5 | 9 |
5 | 10 |
- 后半部分互打
u | v |
---|
6 | 7 |
6 | 8 |
6 | 9 |
6 | 10 |
7 | 8 |
7 | 9 |
7 | 10 |
8 | 9 |
8 | 10 |
9 | 10 |
代码
#include<stdio.h>
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=2;i<=n/2;i++)
for(int j=1;j<i;j++)
printf("%d %d\n",j,i);
for(int i=n/2+1;i<n;i++)
for(int j=1;j<=n-i;j++)
printf("%d %d\n",i,j);
for(int i=1;i<=n/2;i++)
for(int j=n-i+1;j<=n;j++)
printf("%d %d\n",i,j);
for(int i=n/2+1;i<n;i++)
for(int j=i+1;j<=n;j++)
printf("%d %d\n",i,j);
}
return 0;
}