题意:求解一个上界是n的数列,数列每一项是正数且各不相同且后一项减去前一项共有k个不同的值。
解题思路:
保证最大元素不超过n,那么找到一个最优策略生成这个数列即可。
第一项确定为最小的1,然后让差距逐渐减小在减小k-1次后直接将差距变为1,这样即可生成满足任何一组数据的正确数列。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int Max = 100010;
int ans[Max],tmp[Max],vis[Max];
int main(){
// freopen("in.txt", "r", stdin);
int n,k;
scanf("%d%d",&n,&k);
for(int i=1; i<=k - 1; i++) tmp[i] = n - i;
tmp[k] = 1;
for(int i=1; i<=n; i++) vis[i] = 0;
vis[1] = 1,ans[0] = 1;
int t = 1;
for(int i=1; i<n; i++){
int a = ans[i - 1] - tmp[t], b = ans[i - 1] + tmp[t];
if(a > 0 && !vis[a]) ans[i] = a, vis[a] = 1;
else ans[i] = b, vis[b] = 1;
if(t < k) t++;
}
printf("%d",ans[0]);
for(int i=1; i<n; i++)
printf(" %d",ans[i]);
printf("\n");
return 0;
}