1282: ykc想吃好吃的

1282: ykc想吃好吃的

时间限制: 1 秒  内存限制: 128 MB  |  提交: 728  解决: 99  

题目链接:http://172.18.66.54:50015/JudgeOnline/problem.php?id=1282

题目描述

一天,ykc在学校闲的无聊,于是决定上街买点吃的,ykc很懒,本来就不是很像逛街,于是找来了czl帮他买,这里应该有滑稽,而czl也不愿为ykc买东西吃,但是ykc很强势,非让他去买,呢没办法了,然而czl还有很多事要做,没呢么多时间帮ykc,而这条小吃街又很长,有n家店,n有50000这么大,并且这n家店的商品价值有所不同(要知道,商品的价值可能为负,哈哈,很神奇吧,但是czl肯定不会傻到赔钱,所以你懂的),哇,czl要疯了,他不想逛这么久啊,他还有个毛病,他只会连续的逛若干家店,并且由于这条街的店很多,所以肯定不会是一条直线,换句话说就是首尾相连,即第n家店和第一家店是连在一起的,然而ykc希望czl买的东西价值最大,不然就会不开心,于是他就把艰难的任务交给你了,他真的不想浪费时间,你能帮助他吗?

输入

第1行:小吃街的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数,代表每个店的商品价值 (-10^9 <= S[i] <= 10^9)

输出

czl能买到的最大价值

样例输入

6
-2 11 -4 13 5 -2

样例输出

25
思路: 环装最大连续字段和

<1> 正环最大连续字段和 <2> 反环最大连续字段和 比较去最大
#include<cstdio>
 
#define maxn 50000+100
typedef long long LL ; 
LL num[maxn] ; 
int n ;
LL sum , result  ; 
 
LL maxnum(LL *a){
    LL k = 0 , ans1=0 ; 
    for(int i=0 ; i<n ; i++){
        if(k<0)
            k=0 ; 
        k+=num[i] ; 
        if(k>ans1)
            ans1 = k ; 
    }
    return ans1 ;
}
 
 
int main(){
    while(~scanf("%d" , &n)) {
        for(int i=0 ; i<n ; i++){
            scanf("%lld" , &num[i]) ;
            sum+=num[i] ; 
        }
        LL flag = maxnum(num) ; 
        for(int i=0 ; i<n ; i++)
            num[i] = -num[i] ; 
        LL flag2 = maxnum(num) ; 
        result = flag>flag2+sum?flag:flag2+sum ; // 求出的反环最大连续子段和  在原环中是最小的负数或者0
        printf("%lld
" , result) ; 
          
    }
    return 0 ; 
}
/**************************************************************
    Problem: 1282
    User: 201616040106
    Language: C++
    Result: 正确
    Time:16 ms
    Memory:1480 kb
****************************************************************/
/*同时求最大连续子段和 与 最小连续子段和   */

#include<stdio.h> #include<algorithm> using namespace std; int main() { int n; while(~scanf("%d",&n)) { long long summax=0; long long summin=0; long long summx=0,summn=0,sum=0; int num[50005]; for(int i=0;i<n;i++) { scanf("%d",&num[i]); sum+=num[i]; } for(int i = 0 ; i < n ; i++) { summx+=num[i]; summn+=num[i]; summax=max(summax,summx); summin=min(summin,summn); if(summx<0) summx=0; if(summn>0) summn=0; } printf("%lld ",max(summax,sum-summin));// 求出的最小值 是负数或者 0 } return 0; } /************************************************************** Problem: 1282 User: 52lemon Language: C++ Result: 正确 Time:8 ms Memory:1168 kb ****************************************************************/

原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7635867.html