传送门:cf 482A
Permutation p is an ordered set of integers p1, p2, ..., pn, consisting of n distinct positive integers not larger than n. We'll denote asn 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.
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个值
贪心策略题,前k个数不断间隔着从两头取,剩余的n-k个数构成差值为1的等差数列即可
python3:
s = input()
arr = s.split()
n = int(arr[0])
k = int(arr[1])
print(1,end='')
for i in range(2,k+1):
if i % 2 == 0:
print('',n - i//2 + 1,end='')
else:
print('',(i+1)//2,end='')
if k % 2 == 0:
x = n - k//2
for i in range(k,n):
print('',x,end='')
x = x - 1
else:
x = (k + 1)//2 + 1
for i in range(k,n):
print('',x,end='')
x = x + 1
print()
/******************************************************
* File Name: a.cpp
* Author: kojimai
* Create Time: 2014年10月25日 星期六 12时44分05秒
******************************************************/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int judge(int n,int cnt) {
if(cnt%2==0)
return n-(cnt/2)+1;
else
return (cnt+1)/2;
}
void solve(int x,int n)
{
if(x%2 == 0)
for(int l = n - x/2; x < n; l--,x++)
printf(" %d",l);
else
for(int l = (x+1) / 2 + 1; x < n; l++,x++)
printf(" %d",l);
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
cout<<1;
for(int i=2;i<=k;i++)
{
printf(" %d",judge(n,i));
}
solve(k,n);
cout<<endl;
return 0;
}