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 nthe 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.
The single line of the input contains two space-separated positive integers n, 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 number x.
题目意思:给出 n 和 k,要求输出一个含有 n 个数的排列 p1, p2, ...,pn,使得 |p1 - p2|, |p2 - p3|, ..., |pn - 1 - pn| 恰好有 k 个不同的数,p1, p2, ..., pn 每个数是不相等的,而且不大于 n。
n=5,k=4 1 5 2 4 3
n=6,k=4 1 5 2 4 3 6
n=7,k=4 1 5 2 4 3 6 7
n=7,k=5 1 6 2 5 3 4 7
思路:k个不同的数就是 k,k-1,k-2,k-3...1 让p1等于1,可得到p2==k+1,p2-p1=k,简单点说就是奇数项从1递增,偶数项从k+1递减。
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main()
{
int n,k;
while (scanf("%d%d",&n,&k)!=EOF)
{
int ans=k+1;
int cnt=ans;
int cnt2=1;
for (int i=1; i<=ans; i++)
{
if(i%2==0)
{
if(i==ans && ans==n)
{
printf("%d\n",cnt--);
}
else
{
printf("%d ",cnt--);
}
}
else
{
if(i==ans && ans==n)
{
printf("%d\n",cnt2++);
}
else
{
printf("%d ",cnt2++);
}
}
}
if(ans==n)
{
continue;
}
for (int i=ans+1; i<=n; i++)
{
if(i==n)
{
printf("%d\n",i);
}
else
{
printf("%d ",i);
}
}
}
return 0;
}