翻牌游戏

有N张写有数据的牌, 从上到下放成一堆,每次从上面取一张输出,再从上面取一张放回这堆牌的下面。重复这个过程,直到取完,发现取出牌上的数字恰巧是1,2,3...,N,问原先N张牌上的数是什么?

输入格式
第一行1个正整数:N,范围在[1,10000]。

输出格式
第一行1个正整数:N,范围在[1,10000]。

输入/输出例子1
输入:

4

输出:

1 3 2 4


设原来的牌:a1,a2,a3,a4
输出的牌: a1,a3,a2,a4 (即1,2,3,4)
问题变成了:知道输出序列,按照下标排序求输入序列
->离散化


#include<bits/stdc++.h>
using namespace std;
struct st{
    int v,id;  
};
queue<st> q1;
vector<st> q2;
int main(){   
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        q1.push({0,i});
    }
    int k=1;
    while(!q1.empty()){
        st f=q1.front();
        f.v=k++;
        q2.push_back(f);
        q1.pop();
        if(!q1.empty()){
            st f2=q1.front();
            q1.pop();
            q1.push(f2);
        }
    }
    sort(q2.begin(),q2.end(),[](st x,st y)->bool{
       return x.id<y.id;
    });
    for(st e:q2){
        cout<<e.v<<" ";
    }
    return 0;
}

posted on 2024-01-30 19:06  可爱楷玩算法  阅读(204)  评论(0)    收藏  举报

导航