UVA 507 Jill Rides Again

来源:互联网 发布:淮南大数据公司 编辑:程序博客网 时间:2024/04/30 13:40
题目链接: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.   求一段连续的车站的好感度之和最大是多少,还要求出位置。有多个结果时,去区间长度最长的,长度相同,取起点靠前的。
题解:最大字段和问题见http://www.cnblogs.com/CCBB/archive/2009/04/25/1443455.html
代码:
#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;}