【洛谷刷题 | 第六天】

【洛谷刷题 | 第六天】 本系列文章我将总结我在刷算法题所用到的知识如果你也在刷算法并且是新手我相信这系列文章会很适合你。【洛谷刷题 | 第六天】今日题目1.[朝阳区小学组 2019] word字符串知识点字符串2. [COCI 2020/2021 #2] Crtanje模拟字符串知识点\今日题目1.[朝阳区小学组 2019] word字符串链接B4267 [朝阳区小学组 2019] word输入一段最多200行的文本每行包含若干个由空白符分隔的单词每行单词数≤200单词长度≤20需逐行完成两项操作先统计该行的单词数量再将该行单词按字典序从小到大排序最后按“每行先输出单词个数再依次输出排序后的单词单词数为0时仅输出0”的格式输出数据间用一个空格分隔。案例输入 输出thisis a test4a is testthisandcan youdoit5andcandoit you这道题很简单但如果不知道getline的话就会复杂一点主要就是通过getline逐行读取文本内容遍历每行字符拆分出由空格分隔的单词并统计单词数量将拆分后的单词存入数组后按字典序排序最后按“先输出单词个数、再输出排序后单词”的格式逐行输出同时处理空行单词数为0时仅输出0的情况。题解#includebits/stdc.husingnamespacestd;string s,t;string a[209];intmain(){while(getline(cin,s)){intsum0;intns.length();for(inti0;in;i){if(s[i]! ){ts[i];}else{a[sum]t;t;}}if(t!){a[sum]t;t;}sort(a1,asum1);coutsum ;for(inti1;isum;i){couta[i] ;}cout\n;}}知识点字符串getline:是 C 中用于读取一整行文本 的核心函数在处理以行为单位的字符串输入时至关重要 —— 它会从输入流中读取字符直到遇到换行符\n为止且会将换行符从输入流中移除不包含在结果字符串中能完整捕获一行内的所有内容包括多个空格、制表符等空白符。strlen求字符串有效长度不含 ‘\0’charstr[20];cout请输入一个字符串;cinstr;// C读取字符串遇到空格/换行停止intlenstrlen(str);// 计算有效长度不含\0cout字符串有效长度lenendl;请输入一个字符串test字符串有效长度4strcpy复制字符串charstr1[50];charstr2[20];cout请输入要复制的字符串;cinstr2;strcpy(str1,str2);// 把str2复制到str1cout复制后的字符串str1endl;请输入要复制的字符串hello复制后的字符串hellostrcmp比较字符串字典序charstr1[20],str2[20];cout请输入第一个字符串;cinstr1;cout请输入第二个字符串;cinstr2;intresstrcmp(str1,str2);// 比较两个字符串if(res0){cout两个字符串相等endl;}elseif(res0){cout第一个字符串 第二个字符串endl;}else{cout第一个字符串 第二个字符串endl;}请输入第一个字符串abc请输入第二个字符串abd第一个字符串 第二个字符串strcat拼接字符串charstr1[50]hello ;charstr2[20];cout请输入要拼接的字符串;cinstr2;strcat(str1,str2);// 把str2拼到str1末尾cout拼接后的字符串str1endl;请输入要拼接的字符串world拼接后的字符串hello world2. [COCI 2020/2021 #2] Crtanje模拟字符串链接P13426 [COCI 2020/2021 #2] Crtanje输入一个天数 n1≤n≤100和长度为 n 的由 ‘’、‘-’、‘’ 组成的字符串代表 n 天里公司每日净资产的变化 增 1、- 减 1、 不变初始净资产为 0。需在字符矩阵中按规则绘制曲线第 i 天对应矩阵第 i 列‘’ 在当天开始的净资产行画 ‘/’‘-’ 在当天结束的净资产行画 ‘’‘’ 在当天净资产行画 ‘_’其余位置为 ‘.’最终输出包含所有绘制字符的最小矩阵行索引向上递增列索引向右递增。案例输入 输出7./\....---/..\.......\__这个道题用到的算法并不难主要就是思路我开始想的是计算相邻间最长的相同字符长度来确定最终的高度但这个其实是错误的逻辑还会让问题变得复杂 —— 题目中矩阵的高度根本不由字符连续长度决定而是由净资产变化过程中达到的最大值和最小值决定。首先通过遍历输入的字符字符串用变量sum实时追踪每日净资产变化初始为 0并记录每个列天数对应的绘制行号存入数组a和字符类型存入数组b1 代表 /、2 代表 \、3 代表_同时记录净资产的最大值maxx和最小值minn以确定输出矩阵的行范围接着遍历maxx到minn的所有行标记出无任何绘制字符的空行存入 mapp最后从maxx到minn倒序遍历每行因矩阵行索引向上递增仅输出非空行每行按列遍历匹配到绘制行号则输出对应字符否则输出.最终得到包含所有绘制字符的最小矩阵。题解#includebits/stdc.husingnamespacestd;inta[109],b[109];mapint,intp;intmain(){intn;cinn;string c;cinc;intsum0;intmaxx0;intminn0;for(inti0;in;i){if(c[i]){sum;a[i]sum-1;b[i]1;}elseif(c[i]-){sum--;a[i]sum;b[i]2;}elseif(c[i]){a[i]sum;b[i]3;}maxxmax(maxx,sum);minnmin(minn,sum);}for(intimaxx;iminn;i--){boolokfalse;for(intj0;jn;j){if(a[j]i){oktrue;break;}}if(!ok)p[i]1;}for(intimaxx;iminn;i--){if(!p[i]){for(intj0;jn;j){if(a[j]i){if(b[j]1)cout/;elseif(b[j]2)cout\\;elsecout_;}else{cout.;}}cout\n;}}}知识点\为什么反斜杠需要 \\:单个 \ 会被编译器识别为 “转义的开始”比如 \n 代表换行、\t 代表制表符如果直接写 cout‘’;编译器会认为你要写一个转义字符但 \ 后面没有跟任何合法的转义标识会直接报错只有写成 \编译器才会将第一个 \ 解读为 “转义标记”第二个 \ 解读为 “要表示的普通字符”最终输出一个 \。最后如果我的内容对你有帮助请点赞评论收藏。创作不易大家的支持就是我坚持下去的动力