UVa10602 Editor Nottoobad

题目大意

给定N个单词,要求你用Nottoobad编辑器进行输入,如果你当前需要输入的单词与之前一个已经输入的单词有公共部分,那么这公共部分是不需要输入的,只需要粘贴复制即可,第一个单词必须全部输入,其他的单词可以按任意顺序输入,要求你安排一个输入顺序,使得输入操作的次数最少。

题解

一个很简单的贪心,每次输入选择与前一个输入的单词的公共部分长度最长的单词即可,如果公共部分为0,则输入任意一个单词都行。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 105
int f[MAXN];
char s[MAXN][MAXN],ss[MAXN][MAXN];
long ans;
int main(void)
{
    int i,j,n,T,t,maxs,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        memset(f,0,sizeof(f));
        for(i=0; i<n; i++)
        {
            getchar();
            scanf("%s",s[i]);

        }
        ans=strlen(s[0]);
        strcpy(ss[0],s[0]);
        f[0]=1;
        for(i=1; i<n; i++)
        {
            maxs=0;
            for(j=0; j<n; j++)
                if(!f[j])
                {
                    t=0;
                    while((s[j][t]==ss[i-1][t])&&(t<strlen(ss[i-1]))) t++;
                    if(t>maxs)
                    {
                        k=j;
                        maxs=t;

                    }
                }
            if(maxs)
            {
                ans+=strlen(s[k])-maxs;
                strcpy(ss[i],s[k]);
                f[k]=1;
            }
            else
            {
                k=1;
                while(f[k]&&k<n) k++;
                if(k<n)
                {
                    ans+=strlen(s[k]);
                    strcpy(ss[i],s[k]);
                    f[k]=1;
                }
            }
        }
        printf("%ld\n",ans);
        for(i=0; i<n; i++)
            printf("%s\n",ss[i]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zjbztianya/p/3007500.html