Seating Arrangement CSU - 1997 (思维题,是否存在n个数的序列,使得相邻啷个数的差绝对值大于d)

Mr. Teacher老师班上一共有n个同学,编号为1到n。 在上课的时候Mr. Teacher要求同学们从左至右按1, 2, …, n的顺序坐成一排,这样每个同学的位置是固定的,谁没来上课就一目了然了。

但是时间长了之后,Mr. Teacher发现坐得离得远的同学往往因为交流很少而逐渐变得生疏了,于是他决定重新安排同学们的座位,并且在新的座位安排中,任意两个相邻的同学的编号之差的绝对值都必须大于d

现在Mr. Teacher需要你帮忙给出一个座位安排方案。

Input

输入包含不超过100组数据。 每组数据包含两个整数n, d(4 ≤ n ≤ 100, 1 ≤ d ≤ n − 2)

Output

对于每组数据,用一行输出一个可行的座位安排方案,相邻两个数之间用一个空格隔开。 座位安排方案由n个1到n的数组成,从左到右依次描述了各个座位安排给了哪个编号的同学。 如果有多种可行的座位安排方案,输出任意一种即可。 如果不存在满足要求的座位安排方案,则输出“-1”。

Sample Input
6 1
6 3
7 2
Sample Output
2 4 6 1 3 5
-1
1 4 7 3 6 2 5
Hint

对于第一个样例,存在多种可行的方案,如1 3 5 2 4 6,2 5 1 4 6 3,4 6 3 1 5 2等,输出任意一个可行方案即可。

对于第三个样例,同样存在多种可行方案,输出任意一个可行方案即可。


思路: 因为 相邻两个数的差的绝对值一定大于 d,最小满足的情况是 d+1,开始的时候想着,从一个数开始,看看能不能都想差都 想差 d +1 ,但是不行

n= 7  d = 2    1 4 7 2 5 3 6  这时候 5 3 那个地方就相差的是 d了,不满足情况;

我有想着 从一个数开始 加上 d+1 减去 d+2,而这个数要从中间开始,这样就能保证相邻两个数 的差值都大于d了,自己写几个序列,就知道了,d的取值范围了,不管n为奇数还是偶数,只要d>n/2-1的话,都构造不出来;

扫描二维码关注公众号,回复: 948240 查看本文章

所以当 d<=n/2-1时, 从中间构造序列,+n/2   -(n/2+1);

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
	int i,j;
	int n,d;
	while(~scanf("%d%d",&n,&d))
	{
		if(d>n/2-1)
			printf("-1\n");
		else
		{
			int t = n/2;
			if(n%2)
				t = t+1;
				
			for(i = t,j= 1;j<=n;j++)
			{
				if(i!=t) printf(" ");
				printf("%d",i);
				if(j%2) i = i + n/2;
				else i = i - (n/2+1);
			}
			printf("\n");
		}
	} 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/obsorb_knowledge/article/details/80346184