UVA 507 Jill Rides Again

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值