zoukankan      html  css  js  c++  java
  • codeforces B. Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/359/B

    题目意思:给定n和k的值,需要构造一条长度为2n(每个元素取值范围只能是[1,2n])且元素各不相同的序列,这条序列符合等式

           首先非常感谢乌冬兄和syy的帮助!!尤其是乌冬兄。

      刚开始做的时候完全没有思路,写出那条等式的展开式也没有发现规律。在他们的思维引导之下,我终于明白了这个问题其实可以简化为求一对数(假设为ai-1,ai)的差,这个差 = k 即可,但是k必须为负数!!!也就是ai-1  < ai。除此,其他对数只需要满足aj-1 > aj 即可。

           为什么可以这样做?注意这条等式。除了那一对数的差之外,其他对数是可以消去的,前提是这些对数的关系必须和要求的那对数的差的关系正好相反。也就是说,如果那一对数的差满足 ai-1 > ai,那么其余的对数必须是aj-1 < aj。这样我们就可以将问题解决的核心转移到求出那一对数的差中。注意等号右边是2k(k >= 0),那么|ai-1 - ai| = k,ai-1-ai = -k,这样相减 k - (-k) 刚好等于2k。

          求出那一对数的差,我用了一个很简便的办法,就是假设aj-1 = 2n(序列中最大的那个数),aj = 2n - k,除了这两个数之外,其他的数都满足从大到小的顺序(也就是逆序枚举)。特别要注意k = 0的情况,此时就没有必要求出 aj-1 和 aj 了,所有数从2n ~ 1(当然也可以是1~2n)按顺序输出即可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int n, k, i, j;
     9     while (scanf("%d%d", &n, &k) != EOF)
    10     {
    11         if (k != 0)
    12         {
    13             j = 2 * n - k;
    14             printf("%d %d ", j, 2 * n);
    15             for (i = 2 * n - 1; i >= 1; i--)
    16             {
    17                 if (i != j)
    18                     printf("%d ", i);
    19             }
    20         }
    21         else
    22         {
    23             for (i = 2 * n; i >= 1; i--)
    24                     printf("%d ", i);
    25         }
    26         printf("
    ");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    expdp定时备份
    设计模式简介
    利用Python制作万年历
    Linux下Python的安装
    排序算法-直接插入排序
    排序算法-冒泡排序
    数据结构-循环顺序队列&链队列
    数据结构-栈&链栈
    数据结构-双向链表&双向循环链表
    数据结构-单链表&单循环链表
  • 原文地址:https://www.cnblogs.com/windysai/p/3415316.html
Copyright © 2011-2022 走看看