首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

在poj做题时 超时了 求大神们看一下如何可以优化一下

2013-10-03 
在poj做题时 超时了 求大神们看一下怎么可以优化一下在poj刷题 出现超时 求大神们看看我的算法哪里可以优

在poj做题时 超时了 求大神们看一下怎么可以优化一下
在poj刷题 出现超时 求大神们看看我的算法哪里可以优化一下 


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    int count;
    int count2=1;
    scanf("%d",&count);
    int i;
    int j;
    int right=0;
    char h[9];
    char* change(char*);
    char a[100][20];
    char b[100][9];
    for(i=0;i<count;i++)
    {
        scanf("%s",a[i]);
        strcpy(b[i],change(a[i]));
    }
    for(i=0;i<count-1;i++)
        for(j=i+1;j<count;j++)
        {
            if(strcmp(b[i],b[j])>0)
            {
                strcpy(h,b[i]);
                strcpy(b[i],b[j]);
                strcpy(b[j],h);
            }
        }
    for(i=0;i<count;)
    {
        if(strcmp(b[i],b[i+1])==0)
        {
            i++;
            count2++;
            right=1;
        }
        else
        {
            if(right==1)
            {
            if(count2!=1)
            {
                printf("%s %d\n",b[i],count2);
                count2=1;
            }
            }
            else if(right==0)
            {
                printf("No duplicates.");
                i=count;
            }
        }
    }




    return 0;
}
char* change(char* a)
{
    int count=0;
    int i=0;
    char b[9];
    char *p=b;
    for(;*(a+i)!='\0';i++)
    {
        if(*(a+i)=='-')
        {
            continue;
        }
        else if(count==3)
        {
            b[3]='-';
            i--;
            count++;
        }
        else if(*(a+i)>='0'&&*(a+i)<='9')
        {
            b[count]=*(a+i);
            count++;
        }
        else if(*(a+i)=='A'||*(a+i)=='B'||*(a+i)=='C')
        {
            b[count]='2';
            count++;
        }
        else if(*(a+i)=='D'||*(a+i)=='E'||*(a+i)=='F')
        {
            b[count]='3';
            count++;
        }


        else if(*(a+i)=='G'||*(a+i)=='H'||*(a+i)=='I')
        {
            b[count]='4';
            count++;
        }
        else if(*(a+i)=='J'||*(a+i)=='K'||*(a+i)=='L')
        {
            b[count]='5';
            count++;
        }
        else if(*(a+i)=='M'||*(a+i)=='O'||*(a+i)=='N')
        {
            b[count]='6';
            count++;
        }
        else if(*(a+i)=='R'||*(a+i)=='S'||*(a+i)=='P')
        {
            b[count]='7';
            count++;
        }
        else if(*(a+i)=='T'||*(a+i)=='U'||*(a+i)=='V')
        {
            b[count]='8';
            count++;
        }
        else if(*(a+i)=='W'||*(a+i)=='X'||*(a+i)=='Y')
        {
            b[count]='9';
            count++;
        }
    }
    b[count]='\0';
    return p;
}


还有 我以前在poj是用java写的 现在学习嵌入式   所以想用c语言在poj重新刷一下题  熟悉一下c语言 

听说不是用c语言中的指针应该是更快吗 我这个只是把java中的一些输出改成了c语言 算法基本没变 java通过了 C语言为什么反而慢了 

[解决办法]
LZ程序超时的主要原因是:
(1)判断部分的程序陷入死循环
(2)排序不够快

还有数组不够大。

如下修改AC:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b)
{
  return strcmp((char *)a,(char *)b);
}
int main(void)
{
  int count;
  int count2=1;
  scanf("%d",&count);
  int i;
  int j;
  int right=0;
  char h[9];
  void change(char*, char*);//char* change(char*);
  char a[50];//char a[100][20];
  char (*b)[9] = new char[count][9];//char b[100][9];
  for(i=0;i<count;i++)
  {
    scanf("%s",a);//scanf("%s",a[i]);
    change(a, b[i]);//strcpy(b[i],change(a[i]));
  }

  /*
  for(i=0;i<count-1;i++)
    for(j=i+1;j<count;j++)
    {
      if(strcmp(b[i],b[j])>0)
      {
        strcpy(h,b[i]);
        strcpy(b[i],b[j]);
        strcpy(b[j],h);
      }
    }
    */
  qsort(b, count, sizeof(b[0]), cmp);

    for(i=0;i<count;i++)
    {
      while(i<count-1 && strcmp(b[i],b[i+1])==0)
      {
        i++;
        count2++;
      }
      if(count2>1)
      {
        printf("%s %d\n",b[i],count2);
        count2=1;
        right=1;
      }
    }
    if(right==0)
    {
      printf("No duplicates.\n");
    }

    return 0;


}
void change(char* a, char *b)//char* change(char* a)
{
  int count=0;
  int i=0;
  //char b[9];
  //char *p=b;
  for(;*(a+i)!='\0';i++)
  {
    if(*(a+i)=='-')
    {
      continue;
    }
    else if(count==3)
    {
      b[3]='-';
      i--;
      count++;
    }
    else if(*(a+i)>='0'&&*(a+i)<='9')
    {
      b[count]=*(a+i);
      count++;
    }
    else if(*(a+i)=='A'
[解决办法]
*(a+i)=='B'
[解决办法]
*(a+i)=='C')
    {
      b[count]='2';
      count++;
    }
    else if(*(a+i)=='D'
[解决办法]
*(a+i)=='E'
[解决办法]
*(a+i)=='F')
    {
      b[count]='3';
      count++;
    }
    else if(*(a+i)=='G'
[解决办法]
*(a+i)=='H'
[解决办法]
*(a+i)=='I')
    {
      b[count]='4';
      count++;
    }
    else if(*(a+i)=='J'
[解决办法]
*(a+i)=='K'
[解决办法]
*(a+i)=='L')
    {
      b[count]='5';
      count++;
    }
    else if(*(a+i)=='M'
[解决办法]
*(a+i)=='O'
[解决办法]
*(a+i)=='N')
    {
      b[count]='6';
      count++;
    }
    else if(*(a+i)=='R'
[解决办法]
*(a+i)=='S'
[解决办法]
*(a+i)=='P')
    {
      b[count]='7';
      count++;
    }
    else if(*(a+i)=='T'
[解决办法]
*(a+i)=='U'
[解决办法]
*(a+i)=='V')
    {
      b[count]='8';
      count++;
    }
    else if(*(a+i)=='W'
[解决办法]
*(a+i)=='X'
[解决办法]
*(a+i)=='Y')
    {
      b[count]='9';
      count++;
    }
  }
  b[count]='\0';
  //return p;
}

热点排行