zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    (转)干货|一次完整的性能测试,测试人员需要做什么?
    (转)JMeter性能测试-服务器资源监控插件详解
    【Android Apk重新签名报错re-sign.jar之解决方法】
    CrackMe_001
    判断二叉树是否是镜像对称
    顺时针打印矩阵
    利用前序遍历和中序遍历构造二叉树
    二叉树的四种遍历方式
    最长回文子串
    同步/异步/阻塞/非阻塞
  • 原文地址:https://www.cnblogs.com/syjp/p/10360496.html
Copyright © 2011-2022 走看看