[rqnoj145]打水漂

题目描述:

君不知,打靶大牛goleenuoer可喜欢打水漂了,他的靶子可以打到河面上的任何一条鱼,可是他的水漂打得实在是烂,无论怎么打那石子只会在河面上跳跃两次就“扑通”了.这天他又来打了.这条宽w米,每隔一米都会有一条鱼,每条鱼都有它的美观值.他想知道如何打才能得到两条鱼之间最大的美观值总和.刚接触OI的他想请您来解答,您能帮助他吗???

输入格式

输入文件包含n+1个整数,第一行为一个整数n(n<=10000).从第二行工n个数,第i个整数表示第i条鱼的美观值范(围为-500..500).当所有整数都为负数时输出0.

输出格式

输出文件包含两行,第一行为石子的起点和落点,用空格隔开.第二行为一个整数表示所得到的两条鱼之间美观值总和.

样例输入

10
5 8 -5 -10 5 1 -3 2 4 2

样例输出

0 2
13

最大子段和
var
 x:array[0..10000]of longint;
 dp:array[0..10000,0..1]of longint;
 i,n,max,t:longint;
begin
 readln(n);
 for i:=1 to n do
  read(x[i]);
 dp[1,0]:=1; dp[1,1]:=x[1];
 for i:=2 to n do
  if dp[i-1,1]+x[i]>x[i]
  then begin dp[i,1]:=dp[i-1,1]+x[i]; dp[i,0]:=dp[i-1,0]; end
  else begin dp[i,1]:=x[i]; dp[i,0]:=i; end;
 max:=0;
 for i:=1 to n do
  if dp[i,1]>max
  then begin max:=dp[i,1]; t:=i; end;
 if max=0
 then writeln(0)
 else
  begin
   writeln(dp[t,0],' ',t);
   writeln(dp[t,1]);
  end;
end.
枚举前缀和
var
 s,x:array[0..10000]of longint;
 i,j,ans,a,b,n:longint;
begin
 readln(n);
 for i:=1 to n do
  begin
   read(x[i]);
   s[i]:=s[i-1]+x[i];
  end;
 ans:=0; a:=0; b:=0;
 for i:=1 to n do
  for j:=i+1 to n do
   if s[j]-s[i-1]>ans
   then begin ans:=s[j]-s[i-1]; a:=i; b:=j; end;
 if ans=0
 then writeln(0)
 else
  begin
   writeln(a,' ',b);
   writeln(ans);
  end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值