zoukankan      html  css  js  c++  java
  • 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 ****************************************************************/
    
    
  • 相关阅读:
    常见面试题
    Spring boot 集成ckeditor
    SchuledExecutorService 使用controller控制线程关闭
    sql用法
    Spring Boot 全局异常配置
    前端错误提示whitelabel error page
    github使用方法
    前端迭代取出 后台map返回的数据
    Codeforces Beta Round #31 (Div. 2, Codeforces format)
    Codeforces Beta Round #29 (Div. 2, Codeforces format)
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7635867.html
Copyright © 2011-2022 走看看