PKU-1002题超时了,郁闷!

来源:互联网 发布:com永久域名注册 编辑:程序博客网 时间:2024/05/16 02:10

      今晚写了PKU-ACM上的1002号题,写好后在自己的机子上通过多组典型测试没有问题,但是上传到PKU上后,显示状态为“Time Limit Exceeded”,颇感郁闷啊,说明算法很烂!再重写吗?

       代码如下:

 [code]

#include <iostream>

#include <cctype>

#include <cstring>

 

class Tel

{

private:

    char original[8];

public:

    Tel();

    Tel(char * str);

    void show()const;

    char convert(char);

    friend void Count(const Tel * head, const int);

    friend void Sort(Tel * tel_head, const int);

};

 

int main()

{

    using namespace std;

    int num;

    while(!(cin>>num) || cin.get()!='/n' || num <0)

    {

        cin.clear();

        if(num<0)

        {

            num=0;

            continue;

        }

        while(cin.get()!='/n');

    }

    Tel * head = new Tel[num];

    Sort(head, num);

    Count(head, num);

    delete [] head;

    return 0;

}

 

Tel::Tel()

{

    using namespace std;

    for(int i=0;i<7;i++)

    {

        original[i] = cin.get();

        if(original[i] == '-')

            i -= 1;

        else if((!(isalpha(original[i]))) && (!(isdigit(original[i]))))

            i -= 1;

        else if(original[i] == 'Q' || original[i] == 'Z' || toupper(original[i])=='Q' || toupper(original[i])=='Z')

            i -= 1;

        else if(islower(original[i]))

            original[i] = toupper(original[i]);

        original[i] = convert(original[i]);

    }

    original[7] = '/0';

    cin.clear();

    while(cin.get()!='/n');

}

 

void Tel::show()const

{

    using namespace std;

    for(int i=0;i<7;i++)

    {

        if(i==3)

            cout <<"-";

        cout <<original[i];

    }

}

 

char Tel::convert(char ch)

{

    if(isalpha(ch))

    {

        if(ch=='A' || ch=='B' || ch=='C')

            ch = '2';

        if(ch=='D' || ch=='E' || ch=='F')

            ch = '3';

        if(ch=='G' || ch=='H' || ch=='I')

            ch = '4';

        if(ch=='J' || ch=='K' || ch=='L')

            ch = '5';

        if(ch=='M' || ch=='N' || ch=='O')

            ch = '6';

        if(ch=='P' || ch=='R' || ch=='S')

            ch = '7';

        if(ch=='T' || ch=='U' || ch=='V')

            ch = '8';

        if(ch=='W' || ch=='X' || ch=='Y')

            ch = '9';

    }

    return ch;

}

 

void Count(const Tel * head, const int num)

{

    int count = 1;

    int flag = 1, flag1 = 0,flag2 = 0;;

    int i = 0;

    while(i != num-1)

    {

        while(i != num-1 && flag == 1)

        {

            flag = strcmp(head[i].original, head[i+1].original);

            if(flag == 0)

            {

                count++;

                i++;

                flag = 1;

            }

            else

            {

                flag = 2012;

                flag2 = 1;

            }

        }

        if(count >1)

        {

            head[i].show();

            std::cout <<" "<<count<<std::endl;

            flag1 = 1;

        }

        if(flag2==1)

            i++;

        if(i==num-1 && flag1 == 0)

            std::cout <<"No duplicates.";

        count = 1;

        flag = 1;

    }

    if(num==1)

        std::cout <<"No duplicates.";

}

 

void Sort(Tel * tel_head, const int num)

{

    Tel * head = tel_head;

    int i=0, flag, flag1 = 0;

    char temp[8];

    while(1)

    {

        for(int j=0;j<num-1;j++)

        {

            flag = strcmp(head[j].original, head[j+1].original);

            if(flag > 0)

                flag1 = 1;

        }

        if(flag1==0)

            break;

        while(i != num-1)

        {

            flag = strcmp(head[i].original, head[i+1].original);

            if(flag>0)

            {

                strcpy(temp, head[i].original);

                strcpy(head[i].original, head[i+1].original);

                strcpy(head[i+1].original, temp);

            }

            i++;

        }

        i = 0;

        flag1 = 0;

    }

}

[/code]