免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: davycu
打印 上一主题 下一主题

[算法] 迅雷笔试题 [复制链接]

论坛徽章:
0
101 [报告]
发表于 2011-11-19 10:40 |只看该作者

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
102 [报告]
发表于 2011-12-02 21:19 |只看该作者
回复 76# iamlimeng


    我是这样想的,找两个位置start,end
0到start的总和为负的,同时end到数组结尾总和也是负的,那么start,end之间就是所求的东西了.
my @arr=(9, -12, 120, 8, -20, 100, 30, -89, 20);

my $start;
my $end;

foreach my $i (0..$#arr){
        if( sum_forward($i) <0){
        foreach my $j ($i..$#arr){
                if( sum_afterward($j) <0){
                        $start=$i;
                        $end=$j;
                        }else{
                        next;
                        }
                }
        }else{
        next;
        }
}

my $res=join "\t",(@arr)[$start..$end];
print $res;


sub sum_forward{
        my $pos=shift;
        my $sum=0;
        foreach my $i (0..($pos-1)){
        $sum+=$arr[$i];
        }
        return $sum;
        }

sub sum_afterward{
        my $pos=shift;
        my $sum=0;
        foreach my $i (($pos+1)..$#arr){
        $sum+=$arr[$i];
        }
        return $sum;
        }

论坛徽章:
0
103 [报告]
发表于 2011-12-03 11:04 |只看该作者
如果在考场上遇到这种题目,用最naive的方法实现,如Thompson常说,when in doubt, use brute force,只有当规模很大时,复杂算法才有意义

论坛徽章:
0
104 [报告]
发表于 2011-12-03 11:19 |只看该作者
用动态规划来考虑是这样的:
对数组A[0..n],问题规模为n,假设解为其片段A[i,j]是它的解,当问题规模扩展到n+1时,即求A[0..n+1]的解,可以证明,这个解只可能是A[i,j]和A[i,n+1]两者之一。时间复杂度是O(n)

论坛徽章:
0
105 [报告]
发表于 2011-12-03 20:35 |只看该作者
[img]

[/img]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP