B. JoJo's Incredible Adventures

题意:给定一个01字符串,每次可以将它后移一位,然后放到下一行,问1所形成的矩形的最大面积是多少

思路:我们计算一下最大的连续的1的长度,由于类似于圆,我们直接把头尾相连开个2倍的,然后把这个分解,比如是7,那么我们计算7 1,6 2,5 3,4 4的最大值即可

代码:

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

void solve(){
    string s;
    cin>>s;
    int cnt=0;
    int ans=0;
//    if(s.size()>2)
    s=s+s;
    for (int i = 0; i <s.size() ; ++i) {
        if(s[i]=='1'){
            cnt++;
        }
        else{
            ans=max(ans,cnt);
            cnt=0;
        }
    }
    ans=max(ans,cnt);
    int res=0;
    if(ans==s.size()){
        ans/=2;
        res=ans*ans;
    }
    for (int i = 0; i <=ans/2 ; ++i) {
        res=max(res,(ans-i)*(1+i));
    }
    cout<<res<<' '<<'\n';
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}

C. Constructive Problem

题意:给定一个区间,这个区间的MEX值是k,我们能够执行一个操作,即把l到r的所有数字变成一个数字x,问这个操作能否得到MEX为k+1

思路:我们用set求出原数列的MEX值,然后我们求出MEX+1的左区间和右区间,如果有的话,我们把这个区间涂成MEX,然后再求MEX是否等于MEX+1即可,如果没有刚开始没有找到+1,那么我们可以对任意一个数多余的数涂成MEX,如果有多余的数,就是YES,否则 no

代码:

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

void solve(){
    int n;
    cin>>n;
    set<int>st;
    set<int>prest;
    for (int i = 0; i <=n+1 ; ++i) {
        st.insert(i);
    }
    prest=st;
    vector<int>a(n);
    for (int i = 0; i <n ; ++i) {
            cin>>a[i];
        st.erase(a[i]);
    }
    int mex=*st.begin();
    int l=1e9,r=0;
    for (int i = 0; i <n ; ++i) {
        if(a[i]==mex+1){
            l=min(l,i);
            r=max(r,i);
        }
    }
    for (int i = l; i <=r ; ++i) {
        a[i]=mex;
    }
    if(l==1e9){
        if(n==mex){
            cout<<"NO\n";
        }
        else{
            cout<<"YES\n";
        }
        return;
    }
    for (int i = 0; i < n; ++i) {
        prest.erase(a[i]);
    }
    int mex1=*prest.begin();
    if(mex1==mex+1){
        cout<<"YES\n";
    }
    else{
        cout<<"NO\n";
    }
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}
posted on 2023-07-28 16:11  IR101  阅读(10)  评论(0编辑  收藏  举报  来源