***********************************声明*******************************
原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.youkuaiyun.com/xiaofengcanyuexj)。
由于各种原因,可能存在诸多不足,欢迎斧正!
*******************************************************************
time limit per testPermutationp 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.
The single line of the input contains two space-separated positive integersn, k (1 ≤ k < n ≤ 105).
Print n integers forming the permutation. If there are multiple answers, print any of them.
3 2
1 3 2
3 1
1 2 3
5 2
1 3 2 4 5
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();
}
}
由于时间和水平的原因,难免有不足的地方,欢迎斧正!