这题目思路很清晰,qsort+swith,case+结构体。写完以后很速度的给我tle了。
然后我就各种改,始终没有改进的就是qsort,我就各种纠结,之前一直以为qsort和sort差不多速度,然后我去disscuss那里看大神的代码。发现了2种很巧妙的处理方式
一种是hash[26]={2,2,2,......8,8};这种的,用c-'A'来代表键值,然后就对应到相应的按键了。
第二种是一种巧妙的处理方式 res+=((str[i]-'A'-(str[i]>'Q'))/3+2);
第三种就是我自己写的那个啦,swith,case。
然后我发现我用了第二种巧妙的方法以后仍然超时?结构体?我又改掉了结构体,无奈了,最后发现我的是sort,他的是qsort,我抱着试一试的态度改掉了。出乎意料的AC了。我又把我之前自己写的代码,把qsort改成了sort,ac了,就是下面第一个代码。
通过这个我发现上述第二种真巧妙啊!果然差距一下子就出来了,orz,学习了。
我下面写上2种代码,一种代码是我自己写的,另一种就是借鉴别的更多的。
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <algorithm> 6 using namespace std; 7 int find(char c){ 8 switch(c){ 9 case 'A': 10 case 'B': 11 case 'C': return 2;break; 12 case 'D': 13 case 'E': 14 case 'F': return 3;break; 15 case 'G': 16 case 'H': 17 case 'I': return 4;break; 18 case 'J': 19 case 'K': 20 case 'L': return 5;break; 21 case 'M': 22 case 'N': 23 case 'O': return 6;break; 24 case 'P': 25 case 'R': 26 case 'S': return 7;break; 27 case 'T': 28 case 'U': 29 case 'V': return 8;break; 30 case 'W': 31 case 'X': 32 case 'Y': return 9;break; 33 default : return 1; 34 } 35 } 36 int change(char str[]){ 37 int l=strlen(str); 38 int i; 39 int res=0; 40 int k; 41 char c; 42 for(i=0;i<=l;++i){ 43 if(str[i]>='0'&&str[i]<='9'){ 44 res=res*10+str[i]-'0'; 45 continue; 46 }else if(str[i]>='A'&&str[i]<='Z'){ 47 c=str[i]; 48 switch(c){ 49 case 'A': 50 case 'B': 51 case 'C': k=2;break; 52 case 'D': 53 case 'E': 54 case 'F': k=3;break; 55 case 'G': 56 case 'H': 57 case 'I': k=4;break; 58 case 'J': 59 case 'K': 60 case 'L': k=5;break; 61 case 'M': 62 case 'N': 63 case 'O': k=6;break; 64 case 'P': 65 case 'R': 66 case 'S': k=7;break; 67 case 'T': 68 case 'U': 69 case 'V': k=8;break; 70 case 'W': 71 case 'X': 72 case 'Y': k=9;break; 73 } 74 res=res*10+k; 75 } 76 } 77 return res; 78 } 79 struct num{ 80 int number; 81 int cnt; 82 }res[1000000]; 83 //int cmp(const void *p1,const void *p2){ 84 // return (*(struct num *)p2).number < (* (struct num *)p1).number ?1 :-1; 85 //} 86 bool cmp(num a,num b){ 87 return a.number<b.number; 88 } 89 int main(){ 90 char str[100]; 91 int n,i,j; 92 int t; 93 int cnt; 94 while(~scanf("%d",&n)){ 95 cnt=0; 96 for(i=0;i<100000+10;++i){ 97 res[i].number=1000000000; 98 res[i].cnt=0; 99 } 100 for(i=0;i<n;++i){ 101 scanf("%s",str); 102 t=change(str); 103 res[cnt].number=t; 104 res[cnt++].cnt=1; 105 } 106 //qsort(res,cnt,sizeof(res[0]),cmp); 107 sort(res,res+cnt,cmp); 108 int sign=0; 109 int tmp=res[0].number; 110 int haha=1; 111 for(i=1;i<cnt;++i){ 112 if(res[i].number!=tmp){ 113 if(haha>1){ 114 printf("%03d-%04d %d ",tmp/10000,tmp%10000,haha); 115 sign=1; 116 } 117 tmp=res[i].number; 118 haha=1; 119 }else { 120 haha++; 121 } 122 } 123 if(haha>1){ 124 printf("%03d-%04d %d ",tmp/10000,tmp%10000,haha); 125 sign=1; 126 } 127 if(sign==0) printf("No duplicates. "); 128 } 129 130 return 0; 131 }
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <algorithm> 6 using namespace std; 7 int change(char str[]){ 8 int l=strlen(str); 9 int i; 10 int res=0; 11 int k; 12 char c; 13 for(i=0;i<=l;++i){ 14 if(str[i]>='0'&&str[i]<='9'){ 15 res=res*10+str[i]-'0'; 16 continue; 17 }else if(str[i]>='A'&&str[i]<='Z'){ 18 res=res*10; 19 res+=((str[i]-'A'-(str[i]>'Q'))/3+2); 20 } 21 } 22 return res; 23 } 24 int res[10000000]; 25 /* 26 int cmp(const void *p1,const void *p2){ 27 return *((int *)p2) < *((int *)p1)?1:-1; 28 } 29 */ 30 int cmp(int a,int b){ 31 return a<b; 32 } 33 int main(){ 34 char str[100]; 35 int n,i,j; 36 int t; 37 int cnt; 38 while(~scanf("%d",&n)){ 39 for(i=0;i<n;++i){ 40 scanf("%s",str); 41 t=change(str); 42 res[i]=t; 43 } 44 // qsort(res,n,sizeof(res[0]),cmp); 45 sort(res,res+n,cmp); 46 int sign=0; 47 int tmp=res[0]; 48 int haha=1; 49 for(i=1;i<n;++i){ 50 if(res[i]!=tmp){ 51 if(haha>1){ 52 printf("%03d-%04d %d ",tmp/10000,tmp%10000,haha); 53 sign=1; 54 } 55 tmp=res[i]; 56 haha=1; 57 }else { 58 haha++; 59 } 60 } 61 if(haha>1){ 62 printf("%03d-%04d %d ",tmp/10000,tmp%10000,haha); 63 sign=1; 64 } 65 if(sign==0) printf("No duplicates. "); 66 } 67 return 0; 68 }