left 3 Codeforces Round 913 (Div. 3)

题目链接

A.

把同行同列除了起点都输出即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    char c;int a;cin>>c>>a;
    for(int i=1;i<=8;i++){
        if(i==a)continue;
        cout<<c<<i<<'\n';
    }
    for(int i=0;i<8;i++){
        if((char)('a'+i)==c)continue;
        cout<<(char)('a'+i)<<a<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

B.

把大小写字母分开存储,同时记录输入顺序id
处理完后按输入顺序输出

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    string s;cin>>s;
    vector<pair<int,char>>sm,bi;
    for(int i=0;i<s.size();i++){
        if(s[i]=='b'){
            if(sm.size())sm.pop_back();
        }else if(s[i]=='B'){
            if(bi.size())bi.pop_back();
        }else if(s[i]>='a'&&s[i]<='z')sm.push_back({i,s[i]});
        else bi.push_back({i,s[i]});
    }
    for(auto tmp:sm){
        bi.push_back(tmp);
    }
    sort(bi.begin(),bi.end());
    for(auto tmp:bi){
        cout<<tmp.second;
    }
    cout<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

C.

其实可以简单地看成两部分,因为颜色越多会更优
我们就考虑两种颜色,若最多数量的颜色小等于一半,说明一定可以和其他颜色配对
注意奇偶数,只能偶数个消

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    int n;cin>>n;
    string s;cin>>s;
    vector<pair<int,int>>a(26);
    for(int i=0;i<26;i++)a[i].second=i;
    for(int i=0;i<s.size();i++){
        a[s[i]-'a'].first++;
    }
    sort(a.begin(),a.end(),greater<pair<int,int>>());
    int ma_cnt=a[0].first;
    int sum=0;
    for(int i=0;i<26;i++)sum+=a[i].first;
    if(ma_cnt<=sum/2){
        if(sum%2==0){
            cout<<0<<'\n';return ;
        }else {
            cout<<1<<'\n';return ;
        }
    }else cout<<sum-2*(sum-ma_cnt)<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

二分
先算出现在所能跳的最左边和最右边的值
判能否跳到第i条线段
然后更新到第i条线段的范围

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    int n;cin>>n;
    vector<pair<int,int>>v(n+1);
    for(int i=1;i<=n;i++)cin>>v[i].first>>v[i].second;
    int l=0,r=1e9,mid;
    int ans=1e9;
    while(l<=r){
        mid=(l+r)/2;
        int tl=0,tr=0;
        bool f=0;
        for(int i=1;i<=n;i++){
            tl-=mid;tr+=mid;
            if(tl<=v[i].second&&tr>=v[i].first){
                tl=max(tl,v[i].first);tr=min(tr,v[i].second);
            }else{
                f=1;
                break;
            }
        }
        if(f)l=mid+1;
        else {
            r=mid-1;
            ans=min(ans,mid);
        }
    }
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

E.

举个例子:
9+0+1=10
9+0+1 != 1+0
所以每个数位不能产生进位
那么每个数位就是独立的
枚举每个数位3个数能取哪些值,再全部乘起来

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

int get(int x){
    int ans=0;
    for(int i=0;i<=x;i++){
        for(int j=0;j<=x;j++){
            for(int k=0;i+j+k<=x;k++){
                if(i+j+k==x) {
                    ans++;
                    // cout<<i<<' '<<j <<' '<<k<<'\n';
                }
            }
        }
    }
    return ans;
}
void solve() {
    int n;cin>>n;
    int ans=1;
    while(n){
        ans*=get(n%10);
        n/=10;
    }
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

F.

要求不降序排列,那么只有一种排列情况
必须要处理直到特定排列顺序
而翻转时机不会影响最优解
往前放也不会改变数字的相对顺序
所以要求本来就是非降序排列,只是起点未知
所以两种情况:
1.直接往前放
2.先翻转,再往前放
把逆时针排列的先翻转一次成顺时针排列,省代码
然后按照顺时针排列的处理
但注意第一种情况的计数+1,因为翻转了一次
第2种情况计数-1,因为与第一次翻转抵消(第一次翻转后变回原串)

debug:
判排列的时候,第一个最小值前面一定是最大值
把这个优化加上才可以过,否则超时

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    int n;cin>>n;
    vector<int>a(n);
    int mi=1e9,ma=-1;
    bool su=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        mi=min(mi,a[i]);
        ma=max(ma,a[i]);
        if(i>0){
            if(a[i]>=a[i-1])continue;
            su=1;
        }
      //  cout<<mi<<' '<<a[i]<<'\n';
    }
    if(su==0){
        cout<<0<<'\n';return ;
    }
    bool f=0;
    int l;
    int ans1=1e9;
    for(int i=0;i<n;i++){
        if(a[i]==mi&&a[(i-1+n)%n]==ma){
            f=0;
            l=i;
            for(int j=i+1;j<n;j++){
                if(a[j]>=a[j-1])continue;
                f=1;break;
            }
            if(f==0){
                for(int j=0;j<l;j++){
                    if(j==0){
                        if(a[j]>=a[n-1])continue;
                        f=1;break;
                    }else{
                        if(a[j]>=a[j-1])continue;
                        f=1;break;
                    }
                }
            }
            if(!f){
                ans1=min({ans1,n-l,l+2});
            //    cout<<"ans1="<<ans1<<' '<<"l="<<l<< '\n';
            break;
            }
        }
    }


    reverse(a.begin(),a.end());
   // cout<<"mi="<<mi<<'\n';
   su=0;
   for(int i=1;i<n;i++){
       if(a[i]>a[i-1])continue;
       su=1;break;
   }
   if(su==0){
       cout<<1<<'\n';
       return ;
   }
    for(int i=0;i<n;i++){
        if(a[i]==mi&&a[(i-1+n)%n]==ma){
            f=0;
            l=i;
       //     cout<<"mi="<<mi<<' '<<"l="<<l<<'\n';
            for(int j=i+1;j<n;j++){
                if(a[j]>=a[j-1]){
                //    cout<<"j="<<j<<' '<<"j-1="<<j-1<<'\n';
                    continue;
                }
                f=1;break;
            }
            if(f==0){
                for(int j=0;j<l;j++){
                    if(j==0){
                        if(a[j]>=a[n-1]){
                     //       cout<<"j="<<j<<' '<<"n-1="<<n-1<<'\n';
                            continue;
                        }
                        f=1;break;
                    }else{
                        if(a[j]>=a[j-1]){
                           // cout<<"j="<<j<<' '<<"j-1="<<j-1<<'\n';
                            continue;
                        }
                        f=1;break;
                    }
                }
            }
            if(!f){
                ans1=min({ans1,n-l+1,l+1});
                //cout<<"ans1="<<ans1<<' '<<"l="<<l<< '\n';
                 break;

            }
        }
    }

    if(ans1==1e9)cout<<-1<<'\n';
    else cout<<ans1<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

posted @ 2024-02-04 18:04  WW爆米花  阅读(9)  评论(0编辑  收藏  举报