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 3664
http://poj.org/problem?id=3664 进行两轮选举,第一轮选前n进入第二轮,第二轮选最高   #include #include using namespace std; struct vote { int a,b; int c; ...
735 0
poj-1006-Biorhythms
Description 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。
621 0
|
机器学习/深度学习
|
存储 索引
poj题目分类
http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html
770 0
|
机器学习/深度学习
poj 2912 Rochambeau
点击打开链接poj 2912 思路: 带权并查集 分析: 1 有n个小孩玩游戏,里面有一个入是裁判,剩下的人分为三组。现在我们既不知道裁判是谁也不知道分组的情况。
951 0
poj 1745 Divisibility
点击打开链接poj 1745 思路: dp 分析: 1 又是一道看了题解还不懂怎么个回事的题,然后各种YY之后有点感觉 2 题目要求的是在n个数中间插入n-1个的+或-使得结果能否被k整除 3 看一个数学的公式(a+b)%k = a%k...
787 0