2026CCCC第三次模拟赛 部分题解

链接:https://pintia.cn/problem-sets/2043859722891493376/exam/overview

  这里主要针对天梯赛,其他比赛不太适用,为了自己也为了帮助他人复习以及更稳的备赛,我就做了一个简单的题解。

基础题部分

  这一场的 \(L1\)-\(L7\) 我就不写了,感觉就是简单的模拟。

L8:古风排版

  中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

  输入在第一行给出一个正整数 \(N\)(\(< 100\)),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

  按古风格式排版给定的字符串,每列 \(N\) 个字符(除了最后一列可能不足 \(N\) 个)。

简单讲述:

  这道题本身很简单,这里主要想科普一个 \(C++\) 字符串这一块的工具:\(getline()\)

  这个工具主要是读取一个字符串,和正常 \(cin\) 的不同之处在于 \(cin\) 遇到空格 / 制表符 / 换行符会停止读取,而 \(getline\) 会读取整行(含空格),直到遇到换行符为止。所以在读取一些包含空格的字符串中 \(getline\) 是很有用的。

  格式以及使用可以参考下面代码,需要注意的是,在用 \(getline()\) 读取字符串之前如果有 \(cin\) 的读取,因为 \(cin\) 读取的时候换行符会残留在输入缓冲区中,此时直接调用 \(getline\) 会读取到空行。所以正常使用 \(getline\) 之前需要加上 cin.ignore()

  格式: \(getline\)(\(cin\), 字符串变量)

  讲完之后至少在读取上没有什么问题了,之和根据题意写即可。

参考AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
char ans[N][N];
int n;
int len,id;
string s;
int main(){
    cin>>n;
    cin.ignore();
    getline(cin,s);
    for(int i=0;i<s.size();i++){
        ans[len][id]=s[i];
        id++;
        if(id==n){
            id=0;
            len++;
        }
    }
    while(id>0&&id<n){
        ans[len][id]=' ';
        id++;
    }
    if(id==0)
        len--;
    for(int i=0;i<n;i++){
        for(int j=len;j>=0;j--)
            cout<<ans[j][i];
        cout<<'\n';
    }
    return 0;
}

进阶题部分

L9:字符串维修店

  给定一个长度为 \(2n\) 的合法括号序列(包含(),\[\], {}),为每一对匹配的括号定义整齐度为:该括号内部含有的同类型完整括号对数减去不同类型完整括号对数,要求找出整齐度最大的括号对,若有并列则选左括号下标最小的,输出其整齐度与下标。

  合法括号序列:从左到右遍历括号串时,每个右括号都能匹配到最近的、没被用过的、同类型的左括号,全程不会出现匹配不上、类型错配或括号交叉的情况,最终所有括号都能正确闭合。

简单讲述:

  由于这个是合法括号序列,因此对于任意的字符 \(s_{i}\) ,必然唯一存在一个字符 \(s_{j}\) 与其配对,所以可以根据:每一个右括号都可以匹配上一个最近的、未被匹配的左括号 这句话,可以利用栈来为每个\(s_{i}\) 为左括号的进行配对,设 \(idx_{i}\) 为 \(s_{i}\) 为左括号时候与 \(s_{i}\) 匹配的右括号下标, \(idx_{i}=0\) 代表 \(s_{i}\) 为右括号。

  然后对于每一个左括号的下标 \(i\) ,都有一个区间 \((i,idx_{i})\) ,我们要计算 \((i,idx_{i})\) 中和 \(s_{i},s_{idx_{i}}\) 一样的括号对数,可以根据和 \(s_{i}\) 一样类型的左括号数量进行前缀和处理计算。

参考AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n;
string s;
stack<int>c;
int idx[N];
int s1[N],s2[N],s3[N];

int main(){
    cin>>n>>s;
    s=" "+s;
    for(int i=1;i<=2*n;i++){
        if(s[i]=='('||s[i]=='['||s[i]=='{')
            c.push(i);
        else{
            idx[c.top()]=i;
            c.pop();
        }
    }
    for(int i=1;i<=2*n;i++){        
        s1[i]+=s1[i-1];
        s2[i]+=s2[i-1];
        s3[i]+=s3[i-1];
        if(s[i]=='(')
            s1[i]++;
        if(s[i]=='[')
            s2[i]++;
        if(s[i]=='{')
            s3[i]++;

    }
    int ans=-1,l=-1,r=-1;
    for(int i=1;i<=2*n;i++){
        if(idx[i]==0)
            continue;
        int res=0;
        if(s[i]=='(')
            res=2*(s1[idx[i]-1]-s1[i])-(idx[i]-i-1)/2;
        if(s[i]=='[')
            res=2*(s2[idx[i]-1]-s2[i])-(idx[i]-i-1)/2;
        if(s[i]=='{')
            res=2*(s3[idx[i]-1]-s3[i])-(idx[i]-i-1)/2;
        if(res>ans){
            ans=res;
            l=i;
            r=idx[i];
        }
    }
    cout<<ans<<' '<<l<<' '<<r<<'\n';
    return 0;
}

L10:乐器寄存系统

  题意略

简单讲述:

  感觉就是比较简单的 \(map\) 使用,可以自行学习 \(map\)。

参考AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
map<string,int>sum;
map<string,int>num;
map<pair<string,string>,bool>st;
int main(){
    cin>>n>>m;
    while(n--){
        string s;
        int x;
        cin>>s>>x;
        sum[s]+=x;
    }
    while(m--){
        string a,b,c;
        cin>>a>>b>>c;
        if(a=="store"){
            if(!sum[c]){
                cout<<"Can't store "<<c<<'\n';
            }else if(num[c]==sum[c]){
                cout<<"No place for "<<c<<'\n';
            }else{
                cout<<c<<" stored"<<'\n';
                num[c]++;
                st[{b,c}]=true;
            }
        }else{
            if(!sum[c]){
                cout<<"We don't have "<<c<<" here"<<'\n';
            }else if(!st[{b,c}]){
                cout<<c<<" not found"<<'\n';
            }else{
                st[{b,c}]=false;
                num[c]--;
                cout<<c<<" taken"<<'\n';
            }
        }
    }
    return 0;
}
相关推荐
小羊在睡觉4 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
3DVisionary4 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记4 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466854 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
_日拱一卒4 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM5 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro6 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
voidmort6 小时前
3. 微调(Fine-tuning)与强化学习(RL)的核心思想
python·深度学习·算法
人道领域6 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
QiLinkOS7 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法