Codeforces Round #607 题解

A题

签到题

B题

只需要贪心的调换成只能经过一次调换的最小字符串,再与目标串比较

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        string p;
        cin>>s>>p;
        string t=s;
        int fa=0;
        sort(t.begin(),t.end());
        for(int i=0;i<s.size();i++){
            if(t[i]!=s[i]){
                for(int j=s.size()-1;j>i;j--){
                    if(s[j]==t[i]){
                        swap(s[j],s[i]);
                        fa=1;
                        break;
                    }
                }
            }
            if(fa)
            break;
        }
        if(s<p)
        cout<<s<<endl;
        else{
            cout<<"---"<<endl;
        } 
    }
}
View Code

C题

本题如果直接暴力会超时,因此我们发现,我们无需关心在比X大的字符串的内容,因为不会被用到,那么当字符串比x大的时候,只需要通过公式计算答案即可

注意因为我们在过程中不断取模,所以很可能导致负数,经过多年的做题经验,我发现模数是很神奇的东西,所以我们应当尽量多的地方加模数,防止差错,并且本题要注意爆int

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        int x;
        cin>>x>>s;
        int i;
        ll ans=s.size();
        for(i=0;i<x;i++){
            if(s.size()>x){
                 ans=(ans+(ans-(i+1)+mod)%mod*(s[i]-'1'))%mod; // 因为ans在不断取模,所以可能小于0 
            }
            else{
                if(s[i]=='2')
                s+=s.substr(i+1);
                else if(s[i]=='3')
                s+=s.substr(i+1)+s.substr(i+1);
                ans=s.size();
            }
        }
        cout<<ans%mod<<endl;
        
    }
}
 
View Code

 

posted @ 2020-01-28 11:09  朝暮不思  阅读(104)  评论(0编辑  收藏  举报