zoukankan      html  css  js  c++  java
  • NYOJ 745 蚂蚁的难题(二)

    蚂蚁的难题(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    下雨了,下雨了,蚂蚁搬家了。

    已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈。小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材。因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材。时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大。

     
    输入
    有多组测试数据(以EOF结尾)。
    每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈。(1 <= n<= 50000)
    第二行分别有n个数,代表蚂蚁对第n种食材的喜爱值Vi。(-10^9 <= Vi <= 10^9)
    输出
    输出小蚂蚁能够搬走的食材的喜爱值总和的最大。
    样例输入
    3
    3 -1 2
    5
    -8 5 -1 3 -9
    
    样例输出
    5
    7
    来源
    蚂蚁系列
    上传者
    ACM_李如兵



    解题:环形最大子序列


     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[50010];
    12 int main() {
    13     int n,i;
    14     LL u,v,x,y,sum;
    15     while(~scanf("%d",&n)) {
    16         u = INT_MIN;
    17         v = INT_MAX;
    18         x = y = 0;
    19         for(sum = i = 0; i < n; i++){
    20             scanf("%lld",d+i);
    21             sum += d[i];
    22             
    23             if(x >= 0) x += d[i];
    24             else x = d[i];
    25             u = max(u,x);
    26 
    27             if(y <= 0) y += d[i];
    28             else y = d[i];
    29             v = min(v,y);
    30         }
    31         printf("%lld
    ",max(u,sum-v));
    32     }
    33     return 0;
    34 }
    View Code
    
    
    
     
  • 相关阅读:
    map迭代器
    线段树——校门外的树
    并查集——C
    并查集
    数论—— LCM
    【动态规划】合唱队形
    线段树——D
    线段树——E
    逆元,exgcd,欧拉定理,费马小定理
    待学知识点
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3849798.html
Copyright © 2011-2022 走看看