题目链接:http://codeforces.com/problemset/problem/483/C
题目意思:给出 n 和 k,要求输出一个含有 n 个数的排列 p1, p2, ...,pn,使得 |p1 - p2|, |p2 - p3|, ..., |pn - 1 - pn| 恰好有 k 个不同的数。注意,p1, p2, ..., pn 每个数是不相等的,而且不大于 n。
构造题,这个通过手动很容易知道答案。又献上我的恶心涂鸦~~~看完之后会发现其实很简单,好像比 B 还要简单。
只要红色的竖线前面满足不同的差值恰好有 k 个即可,上面的“+”“-” 是规律来的。竖线后面的差值是清一色等于 1 的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 int main() 9 { 10 int n, k; 11 while (scanf("%d%d", &n, &k) != EOF) 12 { 13 if (k == 1) 14 { 15 for (int i = 1; i <= n; i++) 16 printf("%d ", i); 17 printf(" "); 18 } 19 else 20 { 21 printf("1"); 22 int st = 1; 23 int interval = k; 24 for (int i = 1; i < k+1; i++, interval--) 25 { 26 st += (i&1 ? interval : -interval); 27 printf(" %d", st); 28 } 29 for (int i = k+2; i <= n; i++) 30 printf(" %d", i); 31 printf(" "); 32 } 33 } 34 return 0; 35 }