Gym 100971B Derangement

Posted stupid_one

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym 100971B Derangement相关的知识,希望对你有一定的参考价值。

要求改换序列,使得没有位置是a[i] == i成立。输出最小要换的步数

首先把a[i] == i的位置记录起来,然后两两互相换就可以了。

对于是奇数的情况,和它前一个换或者后一个换就可以,(注意前一个越界或者后一个越界)

这样是不会重复的,因为本来i是a[i] == i的话,换了一个,是不会使得他们两个a[i] == i的

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 200000 + 20;
int a[maxn];
vector<int>pos;
void work ()
{
    int n;
    cin>>n;
    for (int i = 1; i <= n; ++i) scanf ("%d",&a[i]);
    for (int i = 1; i <= n; ++i) {
        if (a[i] == i)
            pos.push_back(i);
    }
    printf ("%d\\n",pos.size() / 2 + (pos.size() & 1));
    if (pos.size() & 1) {
        for (int i = 0; i < pos.size() - 1; i += 2) {
            printf ("%d %d\\n",pos[i],pos[i + 1]);
        }
        int t1 = pos[pos.size() - 1] - 1;
        int t2 = pos[pos.size() - 1] + 1;
        int ans;
        if (t1 != 0) {
            ans = t1;
        } else {
            ans = t2;
        }
        printf ("%d %d\\n",pos[pos.size() - 1],ans);
    } else {
        for (int i = 0; i < pos.size(); i += 2) {
            printf ("%d %d\\n",pos[i],pos[i + 1]);
        }
    }
    return ;
}
int main()
{
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    work ();
    return 0;
}
View Code

 

以上是关于Gym 100971B Derangement的主要内容,如果未能解决你的问题,请参考以下文章

Gym Gym 101147G 第二类斯特林数

OpenAI Gym 入门与提高 Gym环境构建与最简单的RL agent

强化学习 平台 openAI 的 gym 安装 (Ubuntu环境下如何安装Python的gym模块)

openai/gym 中各种环境(Env)的参数解释

2016 USP-ICMC-Codeforces-Gym101063C-Sleep Buddies Gym101063F-Bandejao Gym101063J-The Keys

gym 搭建 RL 环境