• 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


    /*这道题和最大和那道题很相似,但是可以将数看做环循环加,
    不过每个数还是只能用一次,思路就是求出 :
    1.不循环时的最大和m1。
    2.输入数据时求出数串的总和,并且求出最小和m2,想象这些数是一个环,
    那么最大的和就是总和减去最小的和*/
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
    	int n;
    	while(scanf("%d",&n)!=EOF)
    	{
    		long long  t,s,m1,m2,s1,s2;
    		scanf("%lld",&t);
    		s=m1=m2=s1=s2=t;
    		for(int i=1;i<n;i++)
    		{
    			scanf("%lld",&t);
    			s+=t;
    			if(s1+t>t)
    				s1=s1+t;
    			else 
    				s1=t;
    			m1=max(m1,s1);
    			if(s2+t<t)
    				s2+=t;
    			else
    				s2=t;
    			m2=min(s2,m2);
    		}
    		printf("%lld
    ",max(m1,s-m2));
    	}
    	return 0;
    }



  • 相关阅读:
    Undo/Redo的C#实现方式
    c#中@符号作用
    面向对象理解随笔
    C# 面向对象定义常量,属性,方法
    c# 字段和属性
    面向对象思想
    用C表达面向对象语言的机制——C#版
    判断生日
    查找字符
    被7整除
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273790.html
Copyright © 2020-2023  润新知