Seating Arrangement

1997: Seating Arrangement

Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 543     Solved: 171    


Description

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等,输出任意一个可行方案即可。

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

Source

湖南省第十三届大学生计算机程序设计竞赛

 

正确算法

 1 import java.util.Scanner;
 2 
 3 public class Top1 {
 4     public static void main(String[] args) {
 5         Scanner input = new Scanner(System.in);
 6         while(input.hasNext()){
 7             int n = input.nextInt();
 8             int d = input.nextInt();
 9             int a[] = new int[1000];
10             if (d >= n / 2) {
11                 System.out.println("-1");
12             } else {
13                 int t = 0, k = 0;
14                 while (k < n) {
15                     t++;
16                     a[k++] = n / 2 + t;
17                     a[k++] = t;
18                 }
19                 for (int i = 0; i < n - 1; i++) {
20                     System.out.print(a[i] + " ");
21                 }
22                 System.out.println(a[n - 1]);
23             }
24         }
25         input.close();
26     }
27 }

关键点:如果绝对值d大于或等于总人数n/2,那么就不可能有解决方案(奇数一样的,n=6和n=7情况是一样的)

找到关键点后,就剩下输出任意一种排列顺序了。

以上做法采用【绝对值加一】:

4  1

5  2

6  3

7  4

注:采用全排列的方法,会超时

 

posted @ 2018-07-17 21:16  暹罗siam  阅读(381)  评论(0编辑  收藏  举报