| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 698 人关注过本帖
标题:『acm』 程序错再哪?我测试了下输入10w个 要3分钟的样子,怎么不给个timel ...
只看楼主 加入收藏
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
结帖率:81.82%
收藏
 问题点数:0 回复次数:3 
『acm』 程序错再哪?我测试了下输入10w个 要3分钟的样子,怎么不给个timelimit
程序代码:
//---------------------------------------------------------------------------------------------------------
//解题步骤:
//    1,每输入一个合法的字符串,就转换成标准格式
//    2,把格式后的字符串,插入链表
//insert函数工作步骤:
//    1,判断是否为第一次插入,是则直接插入
//    2,维护一个递增链表。
//    3,遍历链表,比较t与结点数据域的大小,来决定互换
//    4,遍历结束,把最大的元素保存到t,在插入表尾
//---------------------------------------------------------------------------------------------------------


#include "stdio.h"
#include "string.h"
#include "stdlib.h"   
#include <time.h>  //测试程序而添加的头 
typedef struct lnode
{
    char data[9];
    int counter;
    struct lnode *next;
}lnode,*linklist;

void changetostande(char*,char*);
int insert(linklist,char* );
int main()
{
    linklist lodeptr,p;
    lnode codelode;
    long i;
    int j;
    char t[9],s[256];

   
   
   
    codelode.next=0;   
    p=lodeptr=&codelode;
    

    scanf("%d",&i);
    if (i>100000) return 0;
    while (i--)
    {    int j=0;
        while (j<8)
        {
            s[j++]= (char)((rand()%10)+48);////测试程序而添加的
        }
               
        changetostande(s,t);//转换成标准格式 ***-****
        //printf("%s\n",t);           
        j=insert(lodeptr,t);//在插入链表
    }
    if (!j)
    {
        printf("%s\n","No duplicates.");
    }
    while (p->next)
    {   
        p=p->next;
        printf("%s %d\n",p->data,p->counter);
    }
   
   
    return 0;
}



int insert(linklist lodeptr,char *t)
{
    linklist p,q,r;   
    int i=0;
    static int n=0 ,j=0;
    char max1[9];
    p=lodeptr->next;


    if (!n)//第一次时,直接插入
    {
        n=1;
        q=malloc(sizeof(lnode));
        q->next=lodeptr->next;
        q->counter=0;
        strcpy(q->data,t);
        lodeptr->next=q;
        return 0;
    }
    else
        while (p)//否则遍历链表
        {   
            i=strcmp(t,p->data);
            if (i==0)
            {
                p->counter++;
               
                return j=1;
            }
            else if(i==1)
            {
                r=p;
                p=p->next;
            }
            else
            {
                strcpy(max1,p->data);
                strcpy(p->data,t);
                strcpy(t,max1);
                r=p;
                p=p->next;
            }   
        }//while 维护一个递增链表把最大的换出来

        q=malloc(sizeof(lnode));
        strcpy(q->data,t);
        q->counter=0;
        q->next=r->next;
        r->next=q;//再插到表尾
   
        return j;
       
}
void changetostande(char* s,char* t)
{//这玩意就没改了,本来想换个比较"0000 1111 2ABC 3DEF 4GHI 5JKL 6NMO 7PRS 8TUV 9WXY",实现功能的。   
   
    int n=0;
    while (*s && n<8)
    {
        if (n==3)
        {
            *(t++)='-';           
            n++;
            *(s--);
        }
       
        else
        {
        switch (*s)
            {
        case 'A':
        case 'B':
        case 'C':
        case '2':    ++n;
            *(t++)='2';
           
            break;
        case 'D':
        case 'E':
        case 'F':
        case '3':    ++n;
            *(t++)='3';
           
            break;
        case 'G':
        case 'H':
        case 'I':
        case '4':    ++n;
            *(t++)='4';
           
            break;
        case 'J':
        case 'K':
        case 'L':
        case '5':    ++n;
            *(t++)='5';
           
            break;
        case 'N':
        case 'M':
        case 'O':
        case '6':    ++n;
            *(t++)='6';
           
            break;
        case 'P':
        case 'R':
        case 'S':
        case '7':    ++n;
            *(t++)='7';
           
            break;
        case 'T':
        case 'U':
        case 'V':
        case '8':    ++n;
            *(t++)='8';
           
            break;
        case 'W':
        case 'X':
        case 'Y':
        case '9':    ++n;
            *(t++)='9';
           
            break;
        case '0':    ++n;
            *(t++)='0';
           
            break;
        case '1':   ++n;
            *(t++)='1';
           
            break;
        default:   
            break;
       
            }//switch
        }//if
        *(s++);
    }//while
   
    *t=0;
}

第一次测试,就这么悲惨。。
搜索更多相关主题的帖子: acm timelimit 输入 
2010-08-20 11:18
acman
Rank: 1
来 自:郑州
等 级:新手上路
帖 子:12
专家分:5
注 册:2010-8-21
收藏
得分:0 
你做 那个上面的题  啊 就是以后请教你了啊
2010-08-21 11:34
快速回复:『acm』 程序错再哪?我测试了下输入10w个 要3分钟的样子,怎么不给个 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020291 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved