题目就不解释了,自己的代码稀烂,毫无速度可言,其实我早就知道会爆时间,不过还是硬着头皮写完了用字符串冒泡的烂程序,因为很久没练习acm,早已经没有了A题的感觉,找找感觉也好。排序效率较高较常用的还是快排,有现成的函数调用,后来看了看别人的结题报告,差不多都是把字符串转成数组。。。贴代码
超时的code
#include <stdio.h> #include <string.h> #include <stdlib.h> char result[100000][8]; char sort[100000][8]; char sTmp[8]; int numCount[100000],nTmp; int flag; int main() { int n; char str[100]; scanf("%d",&n); int nCopy=n; int i,j; while(n--) { j=0; scanf("%s",str); for(i=0;i<strlen(str);i++) { //如果 str[i] 是纯数字,则直接放入 result[j] 中 if(str[i]>=48 && str[i]<=57) { result[n][j]=str[i]; j++; } //如果是字母,按对应映射转成数字j++,否则是横杠则result[j]不移动 else if(str[i]>=65 && str[i]<=80) { result[n][j]=((str[i]-65)/3+2)+48; j++; } else { switch(str[i]) { case'R':result[n][j]=7+48;j++;break; case'S':result[n][j]=7+48;j++;break; case'T':result[n][j]=8+48;j++;break; case'U':result[n][j]=8+48;j++;break; case'V':result[n][j]=8+48;j++;break; case'W':result[n][j]=9+48;j++;break; case'X':result[n][j]=9+48;j++;break; case'Y':result[n][j]=9+48;j++;break; default:; } } } result[n][j]='\0'; //printf("%s\n",result[n]); //测试输出 result 第n行数据 } //输入成功 /*printf("\n"); for(i=nCopy;i>=0;i--) { printf("%s\n",result[i]); }*/ memset(numCount,0,sizeof(numCount)); int count=1; strcpy(sort[0],result[nCopy-1]); nCopy--; flag=0; while(nCopy--) { //将result[nCopy]与每个sort[i]作比较 for(i=0;i<count;i++) { //已录入,跳出比较循环 if(strcmp(sort[i],result[nCopy])==0) { flag=1; numCount[i]++; break; } } if(i>=count) { strcpy(sort[count],result[nCopy]); count++; } } //冒泡排序必然超时 for(i=0;i<count;i++) { for(j=i;j<count;j++) { if(strcmp(sort[i],sort[j])>0) { strcpy(sTmp,sort[j]); strcpy(sort[j],sort[i]); strcpy(sort[i],sTmp); nTmp=numCount[j]; numCount[j]=numCount[i]; numCount[i]=nTmp; } } } //printf("\n"); if(flag==0) { printf("No duplicates.\n"); return 0; } for(i=0;i<count;i++) { if(numCount[i]>=1) { for(j=0;j<7;j++) { if(j==3) printf("-"); printf("%c",sort[i][j]); } printf(" %d\n",numCount[i]+1); } } //printf("count=%d\n",count); return 0; }
A成功的code
#include <stdio.h> #include <stdlib.h> int a[100002]; int map(char ss) //预处理字母和数字的对应关系 { switch(ss) { case 'A':case'B':case'C': return(2); break; case 'D':case 'E':case 'F': return(3); break; case 'G':case'H':case'I': return(4); break; case 'J':case'K':case'L': return(5); break; case 'M':case'N':case'O': return(6); break; case 'P':case'R':case'S': return(7); break; case 'T':case'U':case'V': return(8); break; case 'W':case'X':case'Y': return(9); break; } } int cmp(const void*a,const void*b)//快排自定义cmp { return *(int*)a-*(int*)b; }//用的还是系统函数 int main() { //freopen("1002.txt","r",stdin); int n,ii,i; int ai; scanf("%d",&n); for (ii=0;ii<n;ii++) { char s[256]; scanf("%s",&s); ai=1; i=0; while (ai<=7) { if ((s[i]<='9')&&(s[i]>='0')) {a[ii]=a[ii]*10+s[i]-'0';ai++;} else if ((s[i]<='Z')&&(s[i]>='A')) {a[ii]=a[ii]*10+map(s[i]);ai++;} i++; } }//把输入号码转换为数字 //printf("Input over\n\n"); qsort(a,n,sizeof(int),cmp); int j; i=0; int jude; jude=0; while (i<n-1){ //输出 j=i; while (a[i]==a[i+1]) i++; if (i!=j) {printf("%03d-%04d %d\n",a[i]/10000,a[i]%10000,i-j+1);jude=1;} i++; } if (jude==0) printf("No duplicates.\n"); return 0; }