Diverse Permutation(구성)

2452 단어 div
C. Diverse Permutation
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of n distinct positive integers not larger than n. We'll denote as n the length of permutation p1,   p2,   ...,   pn.
Your task is to find such permutation p 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 integers n, 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 number x.
 
제목:
1~N의 수열을 나타내는 N과 K를 제시하고 어떻게 정렬하느냐고 묻는다. 둘 사이의 차이값의 절대값의 차이수를 K로 만들 수 있는 종수는 K이다.만족하는 서열을 임의로 출력하면 된다.
 
아이디어:
수열을 구성하다.수열을 쓰면 한 수열의 최대 두 두 개의 차이 값도 n-1개에 불과하다는 것을 알 수 있다. 이 수열은 첫 번째 +(n-1)=두 번째 항, 두 번째 항-(n-2)=세 번째 항을 통해 구성될 수 있다.
이럴 줄 알았으면 수열을 만들기 쉬웠을 텐데, 제목에 따라 몇 개의 K가 나와야 하는지, 이 수열의 앞의 K항이 나타나고 나머지는 점차 늘어나거나 줄어들면 된다.
 
      AC:
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int num[100005];

int main() {

    int n, k;
    scanf("%d%d", &n, &k);

    int temp = 1, from = n - 1;
    num[1] = 1;
    for (int i = 2; i <= n; ++i) {
        int res = temp * from;
        num[i] = num[i - 1] + res;
        --from;
        temp *= -1;
    }

    for (int i = 1; i <= k; ++i) {
        printf("%d ", num[i]);
    }

    int ans = num[k];
    if (k % 2) {
        for (int i = k + 1; i <= n; ++i)
            printf("%d ", ++ans);
    } else {
        for (int i = k + 1; i <= n; ++i)
            printf("%d ", --ans);
    }

    printf("
"); return 0; }

 

좋은 웹페이지 즐겨찾기