码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 482 - Diverse Permutation 构造题

时间:2014-10-27 21:13:03      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   for   sp   div   on   

这是一道蛮基础的构造题。

           - k         +(k - 1)      -(k - 2) 

1 + k ,    1 ,         k ,             2,    ...................

         \  /        \  /           \  /

          k          k-1          k-2

如图所示,先构造第一个数,就是1 + k, 然后接下来每个数字和上个数相差k , k -1 , k -2

这样下来,最后一个数字就是一个中间的数字,过程就是不断向中间逼近。

在k + 1后面的数字,只要升序输出就可以了。

 

构造题还是不太熟练阿 QAQ

贴代码了:

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define ll long long
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
using namespace std;
const int INF = 0x3f3f3f3f;

int a[100001];

int main(){
    int i, j, k, t, m, n;
    while(EOF != scanf("%d%d",&n,&k)){
        if(k == 1){
            for(i = 1; i < n; ++i)  printf("%d ",i);
            printf("%d\n",n);
            continue;
        }

        a[1] = 1 + k;
        for(i = 2; i <= k + 1; ++i){
            if(i % 2 == 0)
                a[i] = a[i - 1] - (k - (i - 2));
            else
                a[i] = a[i - 1] + (k - (i - 2));
        }
        int cur = 1;
        for(i = k + 2; i <= n; ++i){
            a[i] = k + 1 + cur++;
        }
        for(i = 1; i < n; ++i){
            printf("%d ",a[i]);
        }
        printf("%d\n",a[n]);
    }
    return 0;
}

 

Codeforces 482 - Diverse Permutation 构造题

标签:style   blog   io   color   os   for   sp   div   on   

原文地址:http://www.cnblogs.com/wushuaiyi/p/4055048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!