2026CCCC第三次模拟赛部分题解如何快速找到?

摘要:链接:https:pintia.cnproblem-sets2043859722891493376examoverview 这里主要针对天梯赛,其他比赛不太适用,为了自己也为了帮助他人复习以及更稳的备赛,我就做了一个简单的题解。
链接: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代码: #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}\) 一样类型的左括号数量进行前缀和处理计算。
阅读全文