EDU 154

发布时间 2023-12-16 15:24:29作者: ycllz

感觉这场的题都挺傻逼的
写一下题解

A

17 71就是两位数的素数

void solve(){
    string s;cin>>s;
    for(auto c:s){
        if(c=='1'||c=='7')cout<<c;
    }cout<<endl;
}

B

注意到第一位必然是0 最后一位必然是1
那我们就找一个间隙左边是0 0相等右边是1 1相等即可
否则一定做不到

void solve(){
    // 01001
    // 01110
    string a,b;cin>>a>>b;
    for(int i=0;i+1<a.size();i++){
        if(a[i]==b[i]&&a[i]=='0'&&a[i+1]==b[i+1]&&b[i+1]=='1'){
            cout<<"YES"<<endl;
            return;
        }
    }
    cout<<"NO"<<endl;
}

C

偷了个数据 发现不对齐其实可以有很多个
那我们维护四个操作即可 有点麻烦

  • 就维护 len即可
  • 得维护 减掉不对齐的位置没 对齐的位置得取min
    0 插入一个不对齐的位置 并且要判断 对齐的位置是不是小于当前
    1 max当前对齐位置 并且不得有不对齐位置
void solve() {
    string s;
    cin >> s;
    int g = 0, len = 0; //
    set<int>b;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '+') {
            len++;
        } else if (s[i] == '-') {
            len--;
            while(b.size()&&*b.rbegin()>len)b.erase(*b.rbegin());
            g = min(g, len);
        } else if (s[i] == '0') {
            if (g < len) {
                b.insert(len);
                if (len <= 1) {
                    NO
                    return;
                }
            } else {
                NO
                return;
            }
        } else if (s[i] == '1') {
            if (b.size()) {
                NO
                return;
            }
            g = max(len, g);
        }
    }
    YES
}

D

发现全都是正整数
但是操作可以负数
要是只能
整数
那么就是我们有多少个ai >= a[i+1]
要是只能负数
那么就是数有多少个 ai <= a[i+1]
我们知道要变成一个升序 显然只能前面
负数 后面*正数这样
那我们枚举那个点前面是负数 后面是正数
发现可以O1转移

void solve() {
    int n;cin>>n;
    vector<int>a(n+1);
    int pre=0,suf=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(i&&a[i-1]>=a[i])suf++;
    }
    int ans=suf;
    for(int i=1;i<n;i++){
        if(a[i]>=a[i-1])pre++;
        if(a[i]>=a[i+1])suf--;
        ans=min(ans,pre+suf);
    }
    cout<<ans<<endl;
}