题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=448
题目:附件
题意:一个求最大子段和。
简单说来就是一段公交车路,各个车站为1,2,3...s, 各个车站之间的这段路好感值是不同的, 例如车站1到车站2的好感度是5, 车站3到车站4的好感度是-3. 求一段连续的车站的好感度之和最大是多少,还要求出位置。有多个结果时,去区间长度最长的,长度相同,取起点靠前的。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int MAX=20000+10;
int a[MAX];
int N;
struct type
{
int l,r,val;
type(){}
type(int _l,int _r,int _val)
{
l=_l;
r=_r;
val=_val;
}
};
type max2(type a,type b)
{
if(a.val!=b.val)
return a.val>b.val?a:b;
else
{
if(a.r-a.l!=b.r-b.l)
return a.r-a.l>b.r-b.l?a:b;
else
return a.l<b.l?a:b;
}
}
type max3(type a,type b,type c)
{
return max2(max2(a,b),c);
}
type MaxSum(int l,int r)
{
if(l==r)
{
return type(l,r+1,a[l]);
}
int mid=(l+r)/2;
type max1=MaxSum(l,mid);
type max2=MaxSum(mid+1,r);
int leftmax=0,rightmax=0;
int leftsum=0,rightsum=0;
int left=mid+1,right=mid;
for(int i=mid; i>=l; i--)
{
leftsum+=a[i];
if(leftsum>=leftmax)
{
leftmax=leftsum;
left=i;
}
}
for(int i=mid+1; i<=r; i++)
{
rightsum+=a[i];
if(rightsum>=rightmax)
{
rightmax=rightsum;
right=i+1;
}
}
return max3(max1,max2,type(left,right,leftmax+rightmax));
}
int main()
{
int T;
cin>>T;
int Tcase=1;
while(T--)
{
cin>>N;
for(int i=1; i<N; i++)
cin>>a[i];
type ans=MaxSum(1,N-1);
if(ans.val<=0)printf("Route %d has no nice parts\n",Tcase++);
else printf("The nicest part of route %d is between stops %d and %d\n",Tcase++,ans.l,ans.r);
}
return 0;
}