Professional Documents
Culture Documents
VX22 AXIII
0 1 2 3 4 5 6 7 8 9 10
fi>>n;
h.resize(n+2); Ghi nhận max
for(int i=1;i<=n;++i)
{
fi>>h[i];
if(ans<h[i]) ans=h[i],il=i,ir=i;
}
h[n+1]=h[n]>=0? -1:1;
if(ans==0)
{
p=il; Tìm điểm cuối
while(p>0)
{
Tìm điểm đầu mới get_q();
if(q-p>ir-il)il=p, ir=q;
get_p(q+1);
}
fo<<ans<<'\n'<<il<<' '<<ir; return 0;
}
Việc tính tổng tiền tố s được thực hiện với các giá trị t=get<0>(b[i]),
Để thuận tiện xử lý cần xác lập giá trị hàng rào s[m]=-MXLL.
Tìm kết quả cuối cùng:
Khởi tạo p
for(int i=p;i<m;i+=2)
{
if(get<0>(b[i])+get<0>(b[i+1])>=0)q=i; Cập nhật kết quả
else
Lưu ý bước duyệt {
t=s[i]-s[p-1]; if(t>=0)q=i;
if(t>ans ||(t==ans && i-p>ir-il)){ans=t; il=p; ir=q;}
if(s[i+1]-s[p]<0) p=i+2;
}
}
Khởi tạo lại p
Nhận xét:
Có thể vòng tránh việc sử dụng mảng b, tuy vậy khi đó việc lập trình trở
nên phức tạp hơn,
Việc chia quá trình xử lý thành các công đoạn, mỗi công đoạn ứng với một
đoạn hoặc mô đun chương trình độc lập, các công đoạn xử lý nối với nhau
thông qua input/output của công đoạn sẽ làm giảm đáng kể độ phức tạp
lập trình.
void get_q()
{
for(int i=p;i<=n+1;++i)
if(h[i]!=0){q=i-1; return;}
}
void get_p(int x)
{
p=-1;
for(int i=x+1;i<=n;++i)
if(h[i]==0){p=i; break;}
}
int main()
{
fi>>n;
h.resize(n+2); ans=-MXLL;
for(int i=1;i<=n;++i){fi>>h[i]; if(ans<h[i]) ans=h[i],il=i,ir=i;}
if(ans<0){fo<<ans<<'\n'<<il<<' '<<ir; return 0;}
h[n+1]=h[n]>=0? -1:1;
if(ans==0)
{
p=il;
while(p>0)
{
get_q();
if(q-p>ir-il)il=p, ir=q;
get_p(q+1);
}
fo<<ans<<'\n'<<il<<' '<<ir; return 0;
}
s.resize(m+2);
s[0]=0;
for(int i=1;i<m;++i)
ATHENA XIII Page 38 of 199 Nguyễn Thanh Tùng
{
t=get<0>(b[i]); if(ans<t)ans=t, il=ir=i;
s[i]=s[i-1]+t;
}
s[m]=-MXLL;
p=1; if(get<0>(b[1])<0)p=2; ans=0;q=p;
for(int i=p; i<m;++i)
{t=get<0>(b[i]);if(t>ans ||(t==ans && i-p>ir-il))ans=t,
il=i, ir=i, flag=true;}
for(int i=p;i<m;i+=2)
{
if(get<0>(b[i])+get<0>(b[i+1])>=0)q=i;
else
{
t=s[i]-s[p-1]; if(t>=0)q=i;
if(t>ans ||(t==ans && i-p>ir-il))
{ans=t; il=p; ir=q; flag=true;}
if(s[i+1]-s[p]<0) p=i+2;
}
}
if(flag)fo<<ans<<'\n'<<get<1>(b[il])<<' '<<get<2>(b[ir]);
else fo<<ans<<'\n'<<il<<' '<<ir;