转载声明:http://blog.csdn.net/L123012013048/article/details/45049521
个人感想:这道题简直烧脑,主要是抓住的点好难,我只分析出2个点,然后就wa成狗,之后我只能借助一下参考文章,补上我缺失的点才能过,主要是没抓住重点.我想逐步的通过我的分析来重新理清思路,我觉得这种题不能像太复杂才行.
分析:
首先我们要决定中间串的位置,很明显,我们只要对所有字符串进行排序,通过比较中间得2个字符串即可,因为(T/2-1)小的串肯定也比要求的S串要小,同理则越大.那么我们分3段来处理2个字符串,假设c1串 < c2串(这是必然的,因为是通过排序出来的).
(1) len(c1)到了结尾,但len(c2)没到,那么ans最后一个字符直接等于c1[len1-1]就好了,因为c2多出来的部分肯定比c1大,例如 ABCD ABCEEEEEE 明显答案是ABCD;
(2)len(c1)没到结尾,但len(c2)到了结尾,我一开始是认为直接输出求出来的ans即可,可是我突然发现, 这种样例 AZZZDE ,B 如果直接输出答案B 或者A都是错的,所以我们得继续推,如果当前 c1【i】==Z,就直接ans+=c1[i],如果没达到结尾就直接 ans+=c1[i]+1, 所以答案应该为AZZZE(我一开始以为是字典序最小,没看清连len也得最小才行),还有一种情况就是AZZZD,B,答案并不是AZZZE,达到结尾直接ans+=c1[i]即可,答案AZZZD,才是最短而且字典序最小.
(3)这是len(c1)和len(c2) 都没到结尾的情况我们通过样例也可以返现, 如果c2[i]>c1[i]+1,那么最好的办法直接 ans+=(c1[i]+1)就好了,然后就可以输出结果了,但是如果 c2[i]==c1[i]+1呢?(这是我第2个点没注意的,我一开始以为直接就ans+=(c1[i])就好了,可是必然是错的),我们也得分情况讨论啊,例如ABCD,ABDE,这答案是ACD!!并不是ABCD,只要len(c2) 还没到结尾, 我可以直接获取 ans+(c2[i]),这才是答案.
总结:要耐心才可以,不要心燥,头疼就休息下,搞清楚情况就好了.
代码:
/* Author:GavinjouElephant
* Title:
* Number:
* main meanning:
*
*
*
*/
//#define OUT
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include