- 论坛徽章:
- 1
|
回复 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;
} |
|