| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 756 人关注过本帖
标题:acm 帮找错。。。 老题目 487-3279
只看楼主 加入收藏
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:9 
acm 帮找错。。。 老题目 487-3279
程序代码:
//---------------------------------------------------------------------------------------------------------
//解题步骤:
//    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;
}
一次处理10w条记录,要3分钟的样子
怎么不给个超时
搜索更多相关主题的帖子: acm 
2010-08-20 12:10
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:10 
10w条记录,按照你的算法大约要50亿次运算,御坂御坂计算着

你要改用快排

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-20 12:18
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
收藏
得分:0 
T(N)=O(N)时间复杂度为n
你别吓我。   难道这样计算:(1+10W)*5W/2

在怎么也得给个超时啊,他怎么说我错误

我也想快排,可这排序,不是一天能看完的。
我想试试这排序咋样,可惜得个鸭蛋(wrong)

[ 本帖最后由 okayyyy 于 2010-8-20 12:32 编辑 ]
2010-08-20 12:27
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
你的复杂度计算错了
另外,你说的到底是什么错???御坂御坂觉得你说的不清楚

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-20 12:36
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
收藏
得分:0 
回复 4楼 御坂美琴
acm就说我错了

我也不知道错在哪
2010-08-20 12:37
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
收藏
得分:0 
没算错吧。
insert函数就是遍历交换 所以为O(N),也就是插入一条最多为N交换
2010-08-20 12:40
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
引用:也就是插入一条最多为N交换
问题是,你要插入n条

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-20 12:41
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
收藏
得分:0 
你要累加次数当然是 n平方,手动添加的话 你加一次要多久?
我去别的acm 再交一次看看,到底错再哪   

学完了快表,在弄弄

[ 本帖最后由 okayyyy 于 2010-8-20 12:49 编辑 ]
2010-08-20 12:47
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:10 
回复 8楼 okayyyy
直接调用qsort一下吧,

我就是真命天子,顺我者生,逆我者死!
2010-08-20 12:59
okayyyy
Rank: 2
等 级:论坛游民
威 望:2
帖 子:102
专家分:70
注 册:2010-6-15
收藏
得分:0 
回复 9楼 BlueGuy
没用过
前天写这个程序,要用2个字符串函数,弄的我错了好几次。
搞了几个小时才知道,strcmp还是strcpy第一个参数要 字符数组。
每次用函数都要去GOOGLE,而且第一次用的话 绝对要耽误我好多时间

qsort用的什么算法?........

[ 本帖最后由 okayyyy 于 2010-8-20 13:10 编辑 ]
2010-08-20 13:06
快速回复:acm 帮找错。。。 老题目 487-3279
数据加载中...
 
   



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

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