牛客小白月赛111【待补】

51 阅读2分钟
题目难度知识点
A 田忌赛马签到
B 正/邪签到
C 复读姬签到
D 收集金币★★DP 递推

image.png 正常发挥,打完ABCD就下机了。误判wa了一发

田忌赛马

#include <bits/stdc++.h>
using namespace std;
int a[15],v[15];
int main() 
{
    cin>>v[0]>>v[1]>>v[2]>>a[0]>>a[1]>>a[2];
    sort(v,v+3);
    sort(a,a+3);
    int cnt=0;
    if(a[1]>v[0]&&a[2]>v[1]) puts("Yes");
    else puts("No");
    return 0;
}

正/邪

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(void)
{
    cin>>n>>s;
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='y') cnt++;
        else{
            int j=i;
            while(j+1<n && s[j+1]==s[i]) j++;
            int len=j-i+1;
            cnt+=len/2;
            i=j;
        }
    }
    cout<<cnt;
    return 0;
}

复读姬

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N],v[N];
string s[N];
int main() 
{
    int n; cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>s[i];
    }
    vector< pair<string,int> >ve;
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int j=i;
        while(j+1<n&&s[j+1]==s[i]) j++;
        int len=j-i+1;
        i=j;
        ve.push_back({s[i],len});
        ans=max(ans,len);
    }
    for(int i=1;i<ve.size()-1;i++)
    {
        if(ve[i-1].first==ve[i+1].first&&ve[i].second==1)
        {
            ans=max(ans,ve[i-1].second+ve[i+1].second);
        }
    }
    cout<<ans;
    return 0;
}

用前后缀数组来存,l[i]就是以s[i]结尾的连续的s[i]的长度。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s[N];
int n,l[N],r[N];
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i];
    l[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(s[i]==s[i-1]) l[i]=l[i-1]+1;
        else l[i]=1;
    }
    r[n]=1;
    for(int i=n-1;i>=1;i--)
    {
        if(s[i]==s[i+1]) r[i]=r[i+1]+1;
        else r[i]=1;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        ans=max({ans,l[i]});
        if(i-1>=1 && i+1<=n  && s[i-1]==s[i+1]) ans=max(ans,l[i-1]+r[i+1]); 
    }
    cout<<ans;
    return 0;
}

收集金币

image.png

最终所有状态取一个max,因为有些是不能走的。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[N][N],n,m,st[N][N],t;
int ans[N][N];
int main() 
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) cin>>a[i][j];
    memset(st,0x3f,sizeof st);
    cin>>t;
    while(t--)
    {
        int x,y,v; cin>>x>>y>>v;
        st[x][y]=v;
    }
    memset(ans,-1,sizeof ans);
    ans[1][1]=a[1][1];
    for(int i=2;i<=n;i++) {
        if(st[1][i]>(i-1)) ans[1][i]=ans[1][i-1]+a[1][i];
        else break;
    }
    for(int i=2;i<=n;i++){
        if(st[i][1]>(i-1)) ans[i][1]=ans[i-1][1]+a[i][1];
        else break;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=2;j<=m;j++)
        {
            if(st[i][j]>(i-1+j-1))
            {
                if(ans[i-1][j]!=-1) ans[i][j]=ans[i-1][j]+a[i][j];
                if(ans[i][j-1]!=-1) ans[i][j]=max(ans[i][j-1]+a[i][j],ans[i][j]);
            }
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++){
            cnt=max(cnt,ans[i][j]);
        }
    }
    cout<<cnt;
    return 0;
}