您的位置:首页 > 其它

poj1002 487-3279

2014-01-01 13:13 190 查看
这题目思路很清晰,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种代码,一种代码是我自己写的,另一种就是借鉴别的更多的。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int change(char str[]){
int l=strlen(str);
int i;
int res=0;
int k;
char c;
for(i=0;i<=l;++i){
if(str[i]>='0'&&str[i]<='9'){
res=res*10+str[i]-'0';
continue;
}else if(str[i]>='A'&&str[i]<='Z'){
res=res*10;
res+=((str[i]-'A'-(str[i]>'Q'))/3+2);
}
}
return res;
}
int res[10000000];
/*
int cmp(const void *p1,const void *p2){
return *((int *)p2) < *((int *)p1)?1:-1;
}
*/
int cmp(int a,int b){
return a<b;
}
int main(){
char str[100];
int n,i,j;
int t;
int cnt;
while(~scanf("%d",&n)){
for(i=0;i<n;++i){
scanf("%s",str);
t=change(str);
res[i]=t;
}
//        qsort(res,n,sizeof(res[0]),cmp);
sort(res,res+n,cmp);
int sign=0;
int tmp=res[0];
int haha=1;
for(i=1;i<n;++i){
if(res[i]!=tmp){
if(haha>1){
printf("%03d-%04d %d\n",tmp/10000,tmp%10000,haha);
sign=1;
}
tmp=res[i];
haha=1;
}else {
haha++;
}
}
if(haha>1){
printf("%03d-%04d %d\n",tmp/10000,tmp%10000,haha);
sign=1;
}
if(sign==0) printf("No duplicates.\n");
}
return 0;
}


借鉴别人的,这个516ms,我的500ms还是我的快,哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: