poj 1002 487-3279

来源:互联网 发布:软件培训要好多钱 编辑:程序博客网 时间:2024/06/14 04:49

题目就不解释了,自己的代码稀烂,毫无速度可言,其实我早就知道会爆时间,不过还是硬着头皮写完了用字符串冒泡的烂程序,因为很久没练习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++;} elseif ((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;}


原创粉丝点击