Problem 1478 环形整数串 from http://acm.fzu.edu.cn/problem.php?pid=1478

来源:互联网 发布:查士丁尼瘟疫 知乎 编辑:程序博客网 时间:2024/05/01 20:29

 Problem Description

你知道最大和子串问题么? 就是给你一个整数串,要你求出其中的一个连续子串,要求其和最大。

比如: 串是 -2 2 0 1 -48 1,显然其最大和连续子串是2 0 1,其和是3。

现的问题是如果求环形整数串的最大连续和子串呢?

请编写一个程序解决这个问题。

 Input

本题有多组输入数据,你必须处理到EOF为止

每组数据的第一行有一个整数n, (1<=n<=1000000).第2行有n个整数,每个整数都在[-100,100]的范围内

 Output

每组数据输出一个整数,表示环形整数串最大连续子串和。

 Sample Input

6-2 3 0 1 -48 8021 3

 Sample Output

824

 Source

FOJ月赛-2007年3月
需要注意当min=sum时,sum-min是没有东西的。




[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <algorithm>  
  3. #include <cstdio>  
  4. using namespace std;  
  5. int main(){  
  6.   
  7.     //freopen("in.txt", "r", stdin);  
  8.   
  9.     long long sum;  
  10.     long long max;  
  11.     long long smax;  
  12.     long long smin;  
  13.     long long min;  
  14.     int num;  
  15.     int n;  
  16.   
  17.     while(cin>>n){  
  18.         scanf("%d", &num);  
  19.         smax = num;  
  20.         max = num;  
  21.         smin = num;  
  22.         min = num;  
  23.         sum = num;  
  24.         for(int i=1;i<n;++i){  
  25.             scanf("%d", &num);  
  26.   
  27.   
  28.             sum += num;  
  29.   
  30.             smax = smax>0?smax+num:num;  
  31.             smin = smin<0?smin+num:num;  
  32.   
  33.             if(smax>max){  
  34.                 max = smax;  
  35.             }  
  36.             if(smin<min)  
  37.                 min = smin;  
  38.   
  39.         }  
  40.   
  41.         if(sum-min>max && sum!=min)  
  42.             cout<<sum-min<<endl;  
  43.         else  
  44.             cout<<max<<endl;  
  45.     }  
  46.   
  47.     //fclose(stdin);  
  48.     return 0;  
  49. }  
原创粉丝点击