AcWing420火星人

タイトル説明:

人間はついに火星の地に着陸し、神秘的な火星人を見ました。

人間も火星人もお互いの言語を理解することはできませんが、私たちの科学者は数字と通信する方法を発明しました。

このコミュニケーション方法はこんな感じです。まず火星人は人間科学者に非常に多くの数を伝えます。科学者はこの数の意味を解読した後、多数に小さな数を加えて火星人に結果を伝えます。人間の答えとして。

火星人は非常に簡単な方法で数字を表現します-指を壊します。

火星人は片手しか持っていませんが、この手には何千もの指があり、1、2、3の番号が付けられています...

火星人の2本の指は自由に位置を入れ替えることができ、彼らはこのように数えました。

火星人は人間の手を使って、指で数える方法を示しました。

親指、中指、中指、薬指、小指の5本の指にそれぞれ1、2、3、4、5の番号を付けると、通常の順序で並べると、5桁の番号12345が形成されます。薬指と小指を入れ替えると5桁の数字12354になり、5本の指の順番を完全に逆にすると54321になります。形成することができ、12345は最小、つまり1、12354は2番目に小さい、2を意味し、54321は最大、つまり120を意味します。

次の表は、指が3本しかない場合に形成できる6つの3桁の数字と、それらが表す数字を示しています。

3桁123132213231 312 321

番号を表します12 3 4 5 6

今、あなたは火星人と通信する最初の地球人になるのに十分幸運です。

火星人はあなたに彼の指を見させ、科学者はあなたに追加する少数を教えてくれます。

あなたの仕事は、火星の指で表される数と科学者が教えてくれた数を加算し、加算の結果に応じて火星の指の順序を変更することです。

この結果が火星の指が表すことができる範囲を超えないことを確認するためにデータを入力します。

入力フォーマット

入力は3行で構成され、最初の行には火星の指の数を表す正の整数Nがあります。

2行目は正の整数Mで、追加する小整数を表します。

次の行は、火星の指の配置の順序を示す、スペースで区切られた1からNまでのN個の整数の配置です。

出力フォーマット

出力は1行のみで、この行にはN個の整数が含まれており、変更後の火星の指の順序を示しています。

隣接する2つの数字はすべてスペースで区切られ、余分なスペースを入れることはできません。

データ範囲

1≤N≤10000、
1≤M≤100

入力サンプル:

5
3
1 2 3 4 5

サンプル出力:

1 2 4 5 3
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
const int MAX = 1e4 + 9;

int n, m, cnt;
int a[MAX], b[MAX];
bool vis[MAX];
int ans[MAX];


int main()
{
    scanf("%d %d", &n, &m);

    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    while(m--)
    {
        next_permutation(a, a + n);
    }

    for(int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44620183/article/details/113727502