『UVA 1610』聚会游戏

转载声明: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 
#include 
//#include
//#include 
//#include 
//#include 
#define MaxN 0x7fffffff
#define MinN -0x7fffffff
#define Clear(x) memset(x,0,sizeof(x))
const int INF=0x3f3f3f3f;
int T;
string name[1005];

int L[1005];
int num[1005];
int main()
{
#ifdef OUT
    freopen("coco.txt","r",stdin);
    freopen("lala.txt","w",stdout);
#endif
    while(scanf("%d",&T),T)
    {

        for(int i=0;i>name[i];
            L[i]=name[i].length();
        }
        sort(name,name+T);

        string c1=name[T/2-1];
        string c2=name[T/2];
        string ans="";

        int len1=c1.length();
        int len2=c2.length();
        int len=max(len1,len2);
        for(int j=0;j

你可能感兴趣的:(『数据结构与算法』)