牛客周赛Round 131

A ICPC Balloons

思路:

简单的 if-else 或者是 swich-case。果然我只有碰到这种简单题才能想到多解。
代码:

cpp 复制代码
void solve()
{
    char c;
    cin>>c;
    if(c=='A')cout<<"red";
    else if(c=='B')cout<<"orange";
    else if(c=='C')cout<<"blue";
    else if(c=='D')cout<<"green";
}

B String Covering

思路:

可以发现,单个 1 是染不出来的。
代码:

cpp 复制代码
void solve()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    bool flag=true;
    int i=0;
    while(i<n){
        if(s[i]=='1'){
            int j=i;
            while(j<n&&s[j]=='1')j++;
            if(j-i==1){
                flag=false;
                break;
            }
            i=j;
        }else i++;
    }
    if(flag)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

C Get The Sequence

思路:

遍历 a[i] 如果 a[i]>=b[pos] 那么 pos++ 否则就找下一个 a 来匹配。不匹配的 a 可以直接删除。
代码:

cpp 复制代码
void solve()
{
    int n,m;
    cin>>n>>m;
    vector<int>a(n);
    vector<int>b(m);
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(int i=0;i<m;i++)
    {
        cin>>b[i];
    }
    int j=0;
    for(int i=0;i<n&&j<m;i++)
    {
        if(a[i]>=b[j]){
            j++;
        }
    }
    if(j==m)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

D Longest Subsequence

思路:

要求最长子序列,我们可以用 dp[x] 来记录以 x 结尾的最长子序列的长度,它只能从 dp[x-1] 或 dp[x+1] 上演变过来。

所以 dp[x]=max(dp[x],max(dp[x-1],dp[x+1])+1)。
代码:

cpp 复制代码
void solve()
{
    int n;
    cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    vector<int> dp(n+5,0);
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int m=max(dp[a[i]+1],dp[a[i]-1])+1;
        dp[a[i]]=max(m,dp[a[i]]);
        ans=max(ans,dp[a[i]]);
    }
    cout<<ans<<endl;
}

E Eat The Candy

思路:

对每一个盒子都计算它所能达到的最大值,最后取所有盒子的最大值。

对于每个位置计算:从左边能搬多少糖到 i、从右边能搬多少糖到 i。
代码:

cpp 复制代码
void solve()
{
    int n;
    cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    vector<int> b(n),c(n);
    int now=a[0];
    for(int i=0;i<n-1;i++)
    {
        b[i+1]=b[i]+min(a[i+1],now);
        now=a[i+1]-min(a[i+1],now);
    }
    now=a[n-1];
    for(int i=n-1;i>=1;i--)
    {
        c[i-1]=c[i]+min(now,a[i-1]);
        now=a[i-1]-min(a[i-1],now);
    }
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int m=a[i];
        if(i)m+=b[i-1];
        if(i!=n-1)m+=c[i+1];
        ans=max(ans,m);
    }
    cout<<ans<<endl;
}

F Bracket Coloring

思路:

括号匹配想到用栈。每一对括号考虑其前后是否相同。
代码:

cpp 复制代码
const int MOD=998244353;
void solve()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    int ans=1;
    vector<int> st;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='('){
            if(i==0||s[i-1]==')')//如果是新的括号组的开始
                st.push_back(1);
            else st.push_back(0);//连续左括号中的一个
        }else{
            if(st.size()==1){//栈大小为1当前匹配的是最外层括号
                ans=ans*2%MOD;
            }else if(st.back()==1){//栈顶为1,这对括号独立
                //序列中两个相邻位置的括号字符相同(同为 '('或同为')'),则它们的颜色不能相同。
                if(i==s.size()-1||s[i+1]=='(')
                    ans=ans*2%MOD;
            }
            st.pop_back();
        }
    }
    cout<<ans<<endl;
}
相关推荐
Omics Pro几秒前
预测性虚拟细胞中显式机理算子
大数据·数据库·人工智能·python·算法·机器学习·自然语言处理
驭渊的小故事2 分钟前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法
牢姐与蒯12 分钟前
位运算及其oj题
c++·算法
小蒋学算法9 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
荆棘鸟智能10 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
hhb_61811 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i11 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
苏打豆11 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
FluxArt12 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
思麟呀12 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法