1037 Magic Coupon
在接收两个数组数据的时候,分别统计两个数组中包含的正数和负数的个数。接收完数据之后对两个数组用sort进行排序,比较两个数组中的正数个数,取最小值b。同理,取负数个数的最小值c。这样,我们只需将排序后的两个数组中的前面b个负数对应相乘,并将结果加起来,再将两个数组后面的c个正数对应相乘,继续把结果相加就可以得到最后的输出结果。
1038 Recover the Smallest Number
32与321按照字典序来排是32321,但是32132会更小。这里我们调整一下字符串数组排序的思路,即按照a+b<b+a来排序,利用sort函数就可以将数组排好序。完成字符串的拼接后,最后的结果需要将前面的0删除。
函数erase():srt.erase(it)用于删除单个元素,it为需要删除元素的迭代器,比如str.erase(str.begin()+4;再来看srt.erase(first,last),其中first为所需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除[first,last)。
这里也可以不用string,而用char数组,然后用strcm()这个字符串比较函数来做。(剑指offer的思路)
1039 Course List for Student
这道题给出的数据比较大,如果是定义好的固定二维数组来储存姓名和对应的选课信息可能会超出内存,这里选用STL里面的向量vector来存储数据可以节省空间。 由于输入学生的姓名是用字母加数字表示的,这里可以用hash的办法将名字转化为数字,方便后面处理信息。
也可以用map<string,set<int>>定义一个映射来做,本质上是一样的,而且set里面自动实现了排序。
PAT甲级——Longest Symmetric String(好题)
这里还是用动态规划中的状态转移方程的解法来做。
令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文串,如果是则为1,不是则为0。这样根据S[i]是否等于S[j],可以把转移的情况分为两类。
若S[i]==S[j],那么只要S[i+1]至S[j-1]是回文子串,S[i]至S[j]就是回文子串,如果前面的S[i+1]至S[j-1]不是是回文子串,那么S[i]至S[j]就不是回文子串。
若S[i]!=S[j],那么S[i]至S[j]就一定不是回文子串。
所以可以得到dp[i][j]=dp[i+1][j-1],S[i]=S[j] ; dp[i][j]=0,S[i]!=S[j]
边界:dp[i][i]=1,dp[i][i+1]=(S[i]==S[i+1])?1:0。
这里在枚举的时候要注意,我们求出了长度为1和2的字串是否为回文串的信息,那么接下来就可以求长度为3的字串是否为回文串,这个过程只需要用到前面的边界信息。依次再去求长度为4、5、6等字串的信息。
还有下面替代gets函数的输入方式:
1041 Be Unique
这道题通过哈希表的方法,初始化为-1,每输入一个数字就将在哈希表对应的以该数字为下标的地方+1,第一个只出现一次的数,就是哈希表中第一个为0的元素的下标。
1042 Shuffling Machine
就是把给定的数组元素按照给定的一种排布方式去重新排布一下,比较简单。用num[]数组记录初始的顺序,用next[]记录每个数组元素对应的排布顺序,然后将next[]数组的值赋给num[]数组,作为下一次“洗牌”的初始顺序。
1043 Is It a Binary Search Tree
首先根据题目给出的数据,建立二叉搜索树。分别对二叉搜索树进行前序遍历、镜像前序遍历、后序遍历、镜像后序遍历(镜像遍历只需要将遍历时的左右子树的位置调换一下就可以了),并将结果分别储存到向量中。 将输入的序列和前序遍历以及镜像前序遍历进行对比,如果相等就输出“YES”以及对应的后序遍历序列,不相等就输出"NO"。