zoukankan      html  css  js  c++  java
  • NYOJ 745 首尾相连数组的最大子数组和

    首尾相连数组的最大子数组和

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的。数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr[n-1],arr[0],…,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选)。
     
    输入
    输入包含多个测试用例,每个测试用例共有两行,第一行是一个整数n(1=<n<=100000),表示数组的长度,第二行依次输入n个整数(整数绝对值不大于1000)。
    输出
    对于每个测试用例,请输出子数组和的最大值。
    样例输入
    6
    1 -2 3 5 -1 2
    5
    6 -1 5 4 -7
    
    样例输出
    10
    14
    
    来源
    淘宝2013年校园招聘一面面试题
    上传者
    ACM_张希鹏

    解题:环形最大子序列和,跟这一题差不多
    code:
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <vector>
     6 #include <climits>
     7 #include <algorithm>
     8 #include <cmath>
     9 #define LL long long
    10 using namespace std;
    11 LL d[100010];
    12 int main() {
    13     int n,i;
    14     LL u,v,x,y,sum;
    15     bool flag;
    16     while(~scanf("%d",&n)) {
    17         u = INT_MIN;
    18         v = INT_MAX;
    19         x = y = 0;
    20         flag = false;
    21         for(sum = i = 0; i < n; i++){
    22             scanf("%lld",d+i);
    23             sum += d[i];
    24             if(d[i] >= 0) flag = true;
    25             if(x >= 0) x += d[i];
    26             else x = d[i];
    27             u = max(u,x);
    28 
    29             if(y <= 0) y += d[i];
    30             else y = d[i];
    31             v = min(v,y);
    32         }
    33         printf("%lld
    ",flag?max(u,sum-v):0);
    34     }
    35     return 0;
    36 }
    View Code
  • 相关阅读:
    [转载]要死的人都后悔些什么
    mysql优化之explain备忘笔记
    memcached 命令操作详解
    linux netstat 命令详解
    linux awk 命令详解
    定时任务FluentScheduler 学习笔记 .net
    webAPI文件上传时文件过大404错误的问题
    用递归形成树结构数据
    webAPP 图片上传
    webAPP踩坑记录
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3849825.html
Copyright © 2011-2022 走看看