牛客多校第十场 I-Tournament(思维、构造)

题意

  • 链接Tournament
  • 给出一个数n,请你安排n个队相互之间互打共n(n-1)/2场比赛,一天一场,每个队在需参加的最早的那场进场需参加的最晚的那场退场,问怎么安排才能使他们待的总时间最少

解题思路

  • 由于每个队在需参加的最早的那场进场需参加的最晚的那场退场,而又要使他们待的总时间最少,所以要使大家的等待时间均匀分配,所以就要分成三个部分
  1. 前半部分互打
  2. 前半部分与后半部分对打
    需要注意使后半部分进场均匀,前半部分退场均匀
  3. 后半部分互打
  • 有点难理解,以n=10为例,看看下表
  1. 前半部分互打
uv
12
13
23
14
24
34
15
25
35
45
  1. 前半部分与后半部分对打,后半部分进场均匀
uv
61
62
63
64
71
72
73
81
82
91
  1. 前半部分与后半部分对打,前半部分退场均匀
uv
110
29
210
38
39
310
47
48
49
410
56
57
58
59
510
  1. 后半部分互打
uv
67
68
69
610
78
79
710
89
810
910

代码

#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;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值