uva10132 - File Fragmentation(文件碎片)

来源:互联网 发布:用友初始化数据库 编辑:程序博客网 时间:2024/06/06 09:37

个人觉得这个题的输入模式不好,我开始的时候就没看懂,什么又是end of file又是case 的。压根就没搞懂怎么样子结束。

看了人家的读取语句,我照着写了下来。

思路: 就是按照字符串长度排序, 用最短的开始找与它长度可以满足lenth的字符串,然后判断即可。

我的判断程序可能写的耗时了,程序跑了12ms。我看一个大牛的代码经过不断优化最后跑了4ms。

其实这个题的数组很规范,所以我们可以小偷懒一下,没必要完全回复,完全验证。

我的代码:

#include <cstdio>#include <cstring>#include <cstdlib>char st[200][300], aim[300];int c, len;int comp(const void *a,const void *b){    char *c = (char*)a, *d = (char*)b;    return strlen(c)-strlen(d);}int is_ok(char *A){    int L, yes;    for(int i = 0; i < c; i++)    {        yes = 1;    L = strlen(st[i]);        for(int j = 0; j < L; j++) if(st[i][j]!=A[j]) { yes = 0; break;}        if(yes) continue; else yes = 1;        for(int j = 0; j < L; j++) if(st[i][L-1-j]!=A[len-1-j]) {yes = 0; break;}        if(yes) continue; else return 0;    }    return 1;}int main (){    int t;    scanf("%d",&t);getchar(); getchar();    while(t--)    {        c = 0;        while(gets(st[c])&&st[c][0]!=0) c++;        qsort(st,c,sizeof(st[0]),comp);        len = strlen(st[0])+strlen(st[c-1]);        for(int i = c-1;i >= 0; i--)        if(strlen(st[i])==len-strlen(st[0]))        {            strcpy(aim,st[0]);  strcat(aim,st[i]);            if(is_ok(aim)) {printf("%s\n",aim); break;}            strcpy(aim,st[i]);  strcat(aim,st[0]);            if(is_ok(aim)) {printf("%s\n",aim); break;}        }        if(t) printf("\n");    }    return 0;}
再贴一下4ms的代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>char s[160][260],p[260],q[260];int cmp(const void *a,const void *b){return strlen((char *)a)-strlen((char *)b);}int judge(int n,int len){int i,j,f;j=1;f=0;for(i=1;i<n;i++){if(strlen(s[i])!=len-strlen(s[j])) continue;strcpy(q,s[j]);strcpy(q+strlen(s[j]),s[i]);if(strcmp(p,q)==0) return 1;strcpy(q,s[i]);strcpy(q+strlen(s[i]),s[j]);if(strcmp(p,q)==0) return 1;}return 0;}int main(){int T,cnt,i,min,max;scanf("%d",&T);gets(s[0]); getchar();while(T--){cnt=0;while(gets(s[cnt])&& s[cnt][0]!=0) cnt++;qsort(s,cnt,sizeof(s[0]),cmp);min=strlen(s[0]);max=strlen(s[cnt-1]);for(i=cnt-1;i>=0 && strlen(s[i])==max;i--){strcpy(p,s[0]);strcpy(p+strlen(s[0]),s[i]);if(judge(cnt,min+max)) break;strcpy(p,s[i]);strcpy(p+strlen(s[i]),s[0]);if(judge(cnt,min+max)) break;}printf("%s\n",p);if(T) printf("\n");}return 0;}