zoukankan      html  css  js  c++  java
  • 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还是我的快,哈哈
  • 相关阅读:
    linux远程桌面连接 VNC Server
    linux内核 mtd分区
    STC15控制数码管 38译码器
    DS12C887实时时钟
    printf打印字节调试
    LED 控制卡 单元板 接口引脚定义
    linux守护进程start-stop-daemon启动服务
    相机速率计算
    CodeWarrior IDE烧写介绍
    让 Web 站点崩溃最常见的七大原因
  • 原文地址:https://www.cnblogs.com/symons1992/p/3500530.html
Copyright © 2011-2022 走看看