首页 > 代码库 > Codeforces:Diverse Permutation(找规律)

Codeforces:Diverse Permutation(找规律)

***********************************声明*******************************

      原创作品,出自 “晓风残月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 integersp1,???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 lengthn, 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?≤?10范围较大,所以只能寻找时间复杂度为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();
	}
}
    

       由于时间和水平的原因,难免有不足的地方,欢迎斧正!



Codeforces:Diverse Permutation(找规律)