codeforces 483C.Diverse Permutation 解题报告

题目链接: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 }
原文地址:https://www.cnblogs.com/windysai/p/4049857.html