【三次集训】UCFLocal Programming Contest 2012蒟蒻解题思路

B-How Old Are You Mr.String?

题目大意:

给你俩字符串,按他们的z、y、x出现的个数排年龄的老和少,其中优先级为z、y、x

思路:
  1. 用2*3的数组模拟,边扫边生成两个字符串的那行,如果是xyz中的一个就计数,最后按优先级比较两者的zyx。(17:41开始打代码)
  2. 我特么的忘看了个以此类推理解错题意了。。不过更简单了,后来格式错误了一次,发现居然有两个换行?!18:19时AC了

H

题目大意就是个水题
思路

就水过去就行了,第一次格式错误了是因为行末的空格要删掉

C

题目大意:

给你一些指数,让你实现三个功能:一是按底数排序,二是合并想同底数的项,三是写成规定的格式

思路:
  • 用map模拟,键值为底数,最后按底数排序,遇到底数相同的指数相加,最后固定格式输出即可(19:18开始打代码)
  • 19:50一次性AC,现在已经有五个人AK了

C

题目大意:

括号匹配,这里是ab匹配

  • 不只是括号匹配,第一个要求是开头必须有a且保证ab成对出现,且ab之间必须有一个字符,第二个要求是c后面必须。。,他基本没什么用?因为他后面既可以什么都没有也可以随便填什么服从第一个要求的东西都可以
思路:
  1. 我就当括号匹配写了,说实话我不是很懂题目的意思,用栈模拟,一开头如果没有a就直接still,否则,出现一个a就入栈,一直扫獐子岛遇到下一个b就将最近一个[a,b]的内容全部出栈,最后栈里不能有任何非c的元素则输出more(20:46开始打代码)
  2. 21:36总算把这题AC了,期间遇到了段错误的问题,段错误一般是因为堆栈开小了导致爆栈或者期间出现了指针越界的情况。因此我把所有有可能取出栈中元素的地方都加上了判定是否s.empty()==1,注意是先判定在取出否则没用

总结:

  1. 段错误一般有两个原因:堆栈开小了导致爆栈或者在操作堆栈时指针越界,解决办法可以在所有涉及到取出元素的地方先判断是否栈为空。
  2. 有时候会突然出现很莫名其妙的错误,一般这个时候错误的句子不在编译器报错的位置,应该将关于报错变量的相关操作都排查一遍,另外我的STL笔记有一些是错的,不要全抄
  3. 今天还收获了一个返回整数有几位数的模板,这个还挺常用的,收下了:
int getlen(int x){
 int leng=0;
 while(x){
  x/=10;
  leng++;
 }
 return leng;
}
  1. 另外,今天还验证了map是自动按键key的值升序排序的

你可能感兴趣的:(【三次集训】,字符串,指针,堆栈,acm竞赛)