您的位置:首页 > 其它

[rqnoj145]打水漂

2015-06-14 15:43 375 查看

题目描述:

君不知,打靶大牛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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: