hey_left 13 Codeforces Round 849 (Div. 4)

题目链接

A.

可用map标记这几个字符,判在不在即可

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

string s="codeforces";
map<char,bool>mp;
void solve(){
    char c;cin>>c;
    if(mp[c]){
        cout<<"YES"<<'\n';
    }else cout<<"NO"<<'\n';
}

signed main(){
    for(int i=0;i<s.size();i++)mp[s[i]]=true;

    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

B.

直接模拟,看经不经过(1,1)

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

void solve(){
    int n;cin>>n;
    string s;cin>>s;
    int sx=0,sy=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='L')sx--;
        else if(s[i]=='R')sx++;
        else if(s[i]=='U')sy++;
        else if(s[i]=='D')sy--;
        if(sx==1&&sy==1){
            cout<<"YES"<<'\n';
            return ;
        }
    }
    cout<<"NO"<<'\n';
}

signed main(){
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

C.

用双指针模拟

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

void solve(){
    int n;cin>>n;
    string s;cin>>s;
    if(s.size()==1){
        cout<<1<<'\n';
        return ;
    }
    for(int l=0,r=s.size()-1;l<=r;l++,r--){
        if(s[l]=='0'&&s[r]=='1'||s[l]=='1'&&s[r]=='0')continue;
        cout<<(r-l+1)<<'\n';
        return ;
    }
    cout<<0<<'\n';
}

signed main(){
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

D.

乍一看有点虎,经不起细看
求前缀后缀
然后遍历一遍取最大

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

void solve(){
    int n;cin>>n;
    string s;cin>>s;s=' '+s;
    vector<int>pre(n+5),post(n+5);
    map<char,bool>mp;
    for(int i=1;i<s.size();i++){
        if(mp[s[i]]){
            pre[i]=pre[i-1];
            continue;
        }
        mp[s[i]]=true;
        pre[i]=pre[i-1]+1;
    }
    mp.clear();
    for(int i=s.size()-1;i>=1;i--){
        if(mp[s[i]]){
            post[i]=post[i+1];
            continue;
        }
        mp[s[i]]=true;
        post[i]=post[i+1]+1;
    }
    int ma=0;
    for(int i=2;i<=n;i++){
        ma=max(ma,pre[i-1]+post[i]);
    }
    cout<<ma<<'\n';
}

signed main(){
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

E.

dp,把每种情况都记录下来,取最大
dp[i][j]i表示到第i个数为止,最大的和,j表示上一个数变还是不变,0不变,1变
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + a[i];
不变,直接加上a[i]
dp[i][1] = max(dp[i - 1][0] - 2 * a[i - 1], dp[i - 1][1] + 2 * a[i - 1]) - a[i];
若选择变,讨论前一个数变或不变
若不变(说明到第i-1的和是按a[i-1]算的),所以-2a[i-1],算的就是i-1变的
若变了(说明到第i-1的和是按-a[i-1]算的),所以+2
a[i-1],算的就是i-1变的
注意这里的变是相对于前i-1已经算好了(不管受不受i-2影响)
再考虑变不变

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

#define int long long
void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    vector<vector<int>>dp(n+1,vector<int>(2));
    dp[1][0]=a[1];dp[1][1]=a[1];
    for(int i=2;i<=n;i++){
        if(i==2){
            dp[i][0]=dp[i-1][0]+a[i];
            dp[i][1]=-a[i-1]-a[i];
        }else {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + a[i];
            //cout << "**********" << '\n';
            //cout << dp[i - 1][0] << ' ' << dp[i - 1][1] << ' ' << dp[i][0] << '\n';
            dp[i][1] = max(dp[i - 1][0] - 2 * a[i - 1], dp[i - 1][1] + 2 * a[i - 1]) - a[i];
            //cout << dp[i - 1][0] - 2 * a[i] << ' ' << dp[i - 1][1] + 2 * a[i - 1] << ' ' << dp[i][1] << '\n';
        }
    }
    int ans=max(dp[n][0],dp[n][1]);
    cout<<ans<<'\n';
}

signed main(){
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}
posted @ 2024-01-23 12:56  WW爆米花  阅读(2)  评论(0编辑  收藏  举报