poj1002 487-3279

这题目思路很清晰,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 }
借鉴别人的,这个516ms,我的500ms还是我的快,哈哈
原文地址:https://www.cnblogs.com/symons1992/p/3500530.html