| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3350 人关注过本帖, 2 人收藏
标题:一个烦人的算法题。。。高手请进!!!
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
饭桶君,确实太乱了。这和你学土木没有关系,要多修炼代码。

耐着性子看了一段,实在不敢恭维。点评一下,别生气呵

1、你看看你fun和m函数声明的位置与定义的位置。
2、39楼你说你用的是树。我怎么没看到树的影子?你用了一个双向链表,带来的效果是复杂的代码,效率并没有简简单单的数组来的高。
3、代码中存在内存泄漏,主函数中prt没释放,fun中pti没释放。动态申请内存一定要小心。不要滥用。

实在太乱。能写出这样的代码,说明你学习能力不错。但我的感觉是,刚学到这些知识技巧,但凡能用到的地方就想用一用,也不管效果如何。代码写的越长越觉得有成就感。不缩进出矩齿般的形状就好像觉得代码的水平不足似人。

呵呵,为什么这么说,因为我刚学时也是一样的。告诉你这些问题,并不是想打击你。而是想纠正一些观点,使你少走弯路。看好你

送一句我很喜欢的也是一直贯彻的话——大巧不工

重剑无锋,大巧不工
2012-05-31 23:15
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 41楼 beyondyf
你说得对啊,我一看吓一跳,都忘记释放了,编写完之后没有好好检查,编写的时候也不多留个心眼.
你所说的我会经一切努力去改的,不为自己的行为找借口。
学了就想用,你说中了,我现在就是这种心态,以后用什么的时候多推敲一下。
你没有打击到我,相反你让我知道了到底有多烂,我以后得多练!
谢谢你!
我越想越觉得你说得对,你能看穿我们新手,都被你说中了!

[ 本帖最后由 饭桶 于 2012-5-31 23:40 编辑 ]

人得一生得奋斗!
2012-05-31 23:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 42楼 饭桶
这是一个ACM题目。从你对结果的修饰来看你还不了解ACM。

这道题原题的网址是http://

建议去看一下,了解一下什么是ACM及规则,注册个账号玩玩。

重剑无锋,大巧不工
2012-05-31 23:41
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 43楼 beyondyf
我打开了网站是北京大学的,我把代码改了一下,我提交了上去,结果显示是Runtime Error,超时了。
我明天下午改一下,再提交上去看看。
太感谢你了!

人得一生得奋斗!
2012-05-31 23:54
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 44楼 饭桶
runtime error 一般是内存泄露或者超出了数组大小之类的错误,超时是time limit exceed
2012-06-01 06:32
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 43楼 beyondyf
beyondyf大哥,我改了一下,提交上去了,是148K    500MS,半秒的时间太长了。
我贴出代码,还是乱,我试着去改:
程序代码:
#include<stdio.h>
#include<stdlib.h>
void fun();
int m(int a);/*这个函数的功能有两个,当a=0时找出的事最小的一个没有被使用的数,当a!=0时找出的是a之后的最小的那个数(此数大于a小于n),没有找到返回0*/
int flag[1025];/*标识某数已经被使用*/
int life[1024];/*表示date数组中的对应位*/
int date[1024];/*直接操作的数据,存放给出的某个排列*/
int n,k;
int main()
        {    int m,b;
        
            scanf("%d",&m);
        
            for(;m>0;m--)
                {
                    scanf("%d %d",&n,&k);
                    for(b=0;b<n;b++)
                    scanf("%d",date+b);
                    fun();
                    for(b=0;b<n;b++)
                        printf("%d ",date[b]);
                    printf("\n");
                }
            return 0;
        }

void fun()
        {
            int a,sum,b,temp;
            for(a=1;a<=n;a++)
                {
                    flag[a]=1;
                    life[a-1]=n-a;
                }
            for(sum=0;sum!=k;)
                {    
                    b=n-1;
                    while(life[b]==0&&b!=-1)
                        {
                            flag[date[b]]=0;
                            b--;
                        }
                    if(b!=-1)
                    {
                        do{
                        
                            flag[date[b]]=0;
                            temp=date[b]=m(date[b]);
                            b--;
                            }while(temp==0&&b!=-1);
                        b++;
                     }
                     else
                        {b++;temp=0;}
                    if(b==0&&temp==0)/*当找到最后的时候,要返回从最小的开始找*/
                        {
                            date[b]=m(0);
                            life[b]=n-b;
                        }
                    flag[date[b]]=1;
                    life[b]--;
                    b++;
                    for(;b<n;b++)
                        {
                            date[b]=m(0);
                            flag[date[b]]=1;
                            life[b]=n-b-1;
                        }
                    sum++;
                    
                    
                }
            

        }
int m(int a)/*这个函数的功能有两个,当a=0时找出的事最小的一个没有被使用的数,当a!=0时找出的是a之后的最小的那个数(此数大于a小于n),没有找到返回0*/
        {
            int s;
            for(s=1;s<=n&&!a;s++)
                if(flag[s]==0)
                    return s;
            for(s=a+1;a&&s<=n;s++)
                if(flag[s]==0)
                    return s;
            return 0;
        }

人得一生得奋斗!
2012-06-01 10:59
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 45楼 czz5242199
恩,的确是

人得一生得奋斗!
2012-06-01 11:00
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 46楼 饭桶
饭兄 你进步很快啊 这么一下就过了ACM 哈哈 厉害
杨大哥说的不错 你的程序有明显的改善 看起来也顺当多了
继续加油!

梅尚程荀
马谭杨奚







                                                       
2012-06-01 11:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 16楼 pangding
看了下P版的说明 有点疑问 没怎么明白这段代码表示的算法 如果 n = 6 时 给的初始排列是 1 3 6 5 4 2 请问照你给的算法他的下一个排列是什么样的。

梅尚程荀
马谭杨奚







                                                       
2012-06-01 11:52
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
哦。可能是我说的不太清楚,因为确实我发现用语言形容算法不如代码清楚。
过程:
1 3 6 5 4 2
  ^i^ii
1 3 6 5 4 2
  ^i    ^j
1 4 6 5 3 2 // swap i, j
    ^ii    ^last
1 4 2 3 5 6 // reverse(ii, last)

这个例子,比我原来举的那个好多了。回头我再重新描述一下那个算法。


[ 本帖最后由 pangding 于 2012-6-1 12:41 编辑 ]
2012-06-01 12:29
快速回复:一个烦人的算法题。。。高手请进!!!
数据加载中...
 
   



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

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