Codeforces:Diverse Permutation(找规律)

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

      原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.youkuaiyun.com/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 ≤ 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();
	}
}
    

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值