Educational Codeforces Round 82(Div。2向け)(ABCDEソリューションの一部)

消去ゼロ

直接シミュレーション

B国家プロジェクト

最終ラウンドまでに必要なラウンド数を計算し、残りの日数を加算します。最後に、nより小さいかどうかを判断し、nより小さい場合は、さらに数日間実行します。
この質問は3回メンタリティが崩れたわ

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int T;cin>>T;
    while(T--){
    
    
        ll n, g, b;
        cin>>n>>g>>b;
        ll a = n;
        n = (n+1)/2;
        if(n == 0) {
    
    
            cout<<a<<endl; continue;
        }
        ll ans = (n-1)/g * (g+b);
        ans += n-(n-1)/g*g;
        if(ans < a) ans = a;
        cout<<ans<<endl;
    }
}

Cパーフェクトキーボード

キーボードの最初の2文字がパスワードに従って確認された後、後者が確認されます。

#include<bits/stdc++.h>
using namespace std;
int vis[26];
int main()
{
    
    
    int T;cin>>T;
    while(T--){
    
    
        string s; cin>>s;
        string ans; ans.clear();
        memset(vis, 0, sizeof vis);
        ans += s[0]; int c = 0;
        vis[s[0]-'a'] = 1;
        int f = 1;
        for(int i = 1; i < s.size(); ++i){
    
    
            int x = s[i]-'a';
            //cout<<"x:"<<x<<endl;
            if(c+1 == ans.size() && !vis[x]){
    
    
                ans += s[i]; c++; vis[x] = 1;
            }else if(!vis[x]){
    
    
                vis[x] = 1;
                if(c == 0) ans = (char)(s[i])+ans;
                else {
    
    f = 0; break;}
            }else{
    
    
                if(c+1 < ans.size() && ans[c+1] == s[i]) c++;
                else if(c-1 >= 0 && ans[c-1] == s[i]) c--;
                else {
    
    f = 0; break;}
            }
        }
        if(!f) cout<<"NO"<<endl;
        else {
    
    
            cout<<"YES"<<endl;
            for(int i = 0; i < 26; ++i) if(!vis[i]) ans += (char)(i+'a');
            cout<<ans<<endl;
        }
    }
}

Dバッグを埋める

Sumがn未満であるかどうかを判断し、n未満の場合は解決策がないようにする必要があります。そうでない場合は、解決策があり(すべて1に置き換えられ
ます)、nの下位ビットから開始する必要があります。下位ビットの後、このビットの残りを組み合わせることができます。これが存在しない場合は、上から見上げて裏返します。入力ai a_ia1e9未満なので、30ビットで十分です。

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
using namespace std;
int vis[64];
int main()
{
    
    
    int T;cin>>T;
    while(T--){
    
    
            memset(vis,0,sizeof vis);
        ll n; cin>>n;
        int m; cin>>m;
        ll sum = 0;
        while(m--){
    
    
            int x; scanf("%d", &x);
            for(int i = 0; i < 30; ++i) if(x>>i&1) {
    
    vis[i]++; break;}
            sum += x;
        }
        if(sum < n){
    
    
            cout<<-1<<endl; continue;
        }
        int ans = 0;
        for(int i = 0; i < 32; ++i){
    
    
            if(n>>i&1){
    
    
                if(vis[i])  vis[i]--;
                else {
    
    
                    for(int j = i+1; j < 32; ++j){
    
    
                        if(vis[j]){
    
    
                            while(j > i) {
    
    
                                vis[j]--;
                                j--; vis[j] += 2;
                                ans++;
                            }
                            break;
                        }
                    }
                    vis[i]--;
                }
            }
            vis[i+1]+=(vis[i]/2);
        }
        cout<<ans<<endl;
    }
}

Eサブシーケンスの消去

分割ポイントを列挙し、それらを2つの文字列に分割します。次にdp(i、j)dp(i、j)d p i j は、最初の文字列がiiと一致することを意味しますi、2番目の文字列はjjに一致しますjは少なくともssに一致する必要があります判断するいくつかの場所のs

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
using namespace std;
const int maxn = 405;
int nxt[405][26];
char s[maxn];
char t[maxn];
int n;
int dp[maxn][maxn];
bool go(int n1, char *a, int n2, char *b){
    
    
    dp[0][0] = 0;
    for(int i = 0; i <= n1; ++i){
    
    
        for(int j = 0; j <= n2; ++j){
    
    
            if(i+j == 0) continue;
            dp[i][j] = n+1;
            if(i) dp[i][j] = min(dp[i][j], nxt[dp[i-1][j]][a[i]-'a']);
            if(j) dp[i][j] = min(dp[i][j], nxt[dp[i][j-1]][b[j]-'a']);
        }
    }
    return dp[n1][n2] <= n;
}
int main()
{
    
    
    int T; cin>>T;
    while(T--){
    
    
        scanf("%s", s+1);
        scanf("%s", t+1);
        n = strlen(s+1);
        for(int i = 0; i < 26; ++i) nxt[n][i] = nxt[n+1][i] = n+1;
        for(int i = n-1;i >= 0;--i){
    
    
            for(int j = 0;j < 26;++j) nxt[i][j] = nxt[i+1][j];
                nxt[i][s[i+1]-'a'] = i + 1;
        }
        int f = 1;
        int p = 0;
        int len = strlen(t+1);
        for(int i = 1; i <= len; ++i){
    
    
            int x = t[i]-'a';
            p = nxt[p][x];
            if(p == n+1) f = 0;
        }
        if(f){
    
    
            cout<<"YES"<<endl; continue;
        }

        for(int i = 1; i < len; ++i){
    
    
            if(f) break;
            if(go(i, t, len-i, t+i)){
    
    
                f = 1;
            }
        }
        if(f) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}
/*
1
defi
fed
*/

おすすめ

転載: blog.csdn.net/qq_43202683/article/details/104293749