EOJ Monthly 2019.11部分题解

A题

本题虽然是签到题,但是思路十分精巧,提醒我以后思考的时候可以多考虑进制转化的思路

因为本题要求第x个单词,又注意到备选单词的长度是相同的,可以想到用k进制的转化来思考

第x个即求x-1的k进制数,然后按照前后顺序来逐个遍历#号并替换,注意的是,不够要添0

#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<cstdio>
#include <unordered_map>
using namespace std;
const int N=2000005;
const int inf=0x3f3f3f3f;
typedef long long ll;
vector<int> num;
vector<char> c;
int main(){
    int n,m,k;
    ll x;
    string s;
    cin>>n>>m>>k>>x;
    char t;
    cin>>s;
    int i,j;
    x-=1;
    while(x){
        num.push_back(x%k);
        x/=k;
    }
    int mid=m-(int)num.size();
    for(i=0;i<mid;i++)
    num.push_back(0);
    m-=1;
    for(i=0;i<n;i++){
        if(s[i]=='#'){
            for(j=0;j<k;j++){
                cin>>t;
                c.push_back(t);
            }
            sort(c.begin(),c.end());
            cout<<c[num[m]]; 
            m--;
            c.clear();
        }
        else
        cout<<s[i];
    }
    cout<<endl;
}
View Code
posted @ 2020-01-13 20:32  朝暮不思  阅读(152)  评论(0编辑  收藏  举报