poj 1002 487-3279

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


你可能感兴趣的:(poj 1002 487-3279)