您的位置:首页 > 其它

Codeforces:Diverse Permutation(找规律)

2014-11-02 16:56 309 查看
***********************************声明*******************************

      原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

      由于各种原因,可能存在诸多不足,欢迎斧正!

 *******************************************************************
time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

Permutationp is an ordered set of integers
p1,   p2,   ...,   pn, consisting ofn distinct positive integers
not larger thann. We'll denote as
n the length of permutation p1,   p2,   ...,   pn.

Your task is to find such permutationp of length
n, that the group of numbers|p1 - p2|, |p2 - p3|, ..., |pn - 1 - pn|
has exactly k distinct elements.

Input
The single line of the input contains two space-separated positive integersn,
k (1 ≤ k < n ≤ 105).

Output
Print
n integers forming the permutation. If there are multiple answers, print any of them.

Sample test(s)

Input
3 2


Output
1 3 2


Input
3 1


Output
1 2 3


Input
5 2


Output
1 3 2 4 5


Note
By |x| we denote the absolute value of numberx.

题解:

     本题要求给定1到n的序列,满足相邻两项之差的绝对值不相同的个数为k。由于给定的1 ≤ k < n ≤ 105 范围较大,所以只能寻找时间复杂度为O(n)的算法。可以想到该序列最多有n-1个不同的相邻差(绝对值),其中一个满足条件的序列是:n,1,n-1,2,n-3,3…………。可以尝试构造满足条件的前k-1,然后后面的顺序填写。

Java源代码:

 

import java.util.Scanner;

public class Main {

private int k, n;

public Main(int tn, int tk) {
n = tn;
k = tk;
}

public void printMain() {
boolean flag = true;
int count = k - 1;
int i = 1;
while (count > 0) {
if (count != k - 1) {
--count;
if (count <= 0) {
flag = false;
break;
}
System.out.print(" ");
}

System.out.print(i);
System.out.print(" " + (n - i + 1));
++i;
--count;
}
int j = n - i + 1;
if (count != k - 1 && i <= j)
System.out.print(" ");
if (flag) {
while (i <= j) {
System.out.print(j);
--j;
if (i <= j)
System.out.print(" ");
}
} else {
while (i <= j) {
System.out.print(i);
++i;
if (i <= j)
System.out.print(" ");
}
}
System.out.println();
}

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
int tn = input.nextInt();
int tk = input.nextInt();
Main AC = new Main(tn, tk);
AC.printMain();
}
input.close();
}
}
    

       由于时间和水平的原因,难免有不足的地方,欢迎斧正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: