题目链接:
Diverse Permutation - 洛谷https://www.luogu.com.cn/problem/CF482A
思路:
对于一串顺序排列的数,比如1,2,3,4,5,6,如果按一头一尾的顺序取,得到1,6,2,5,3,4,这样相邻两数相减的绝对值的结果数是最多的,如果是1~N的排列,按照这种取法,就最多能取到N-1种相减绝对值结果。而题目要求1~N排列取K种相减结果,那就让1~K+1部分按一头一尾取数,后面部分顺序取就可以了(按顺序取,相减绝对值肯定是1,和前面的必定重复,看成不计入种数)
代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
int main(){
bool flag = false; //用来控制空格
int n, k;
cin >> n >> k;
int left = 1, right = k+1;
for(int i=1; i<=k+1; i++){
//格式控制
if(flag) cout << ' ';
else flag = true;
//头尾交替输出
if(i%2) cout << left++;
else cout << right--;
}
//按顺序输出后面部分
for(int i=k+2; i<=n; i++){
cout << ' ' << i;
}
}