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是没有东西的。
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- using namespace std;
- int main(){
- //freopen("in.txt", "r", stdin);
- long long sum;
- long long max;
- long long smax;
- long long smin;
- long long min;
- int num;
- int n;
- while(cin>>n){
- scanf("%d", &num);
- smax = num;
- max = num;
- smin = num;
- min = num;
- sum = num;
- for(int i=1;i<n;++i){
- scanf("%d", &num);
- sum += num;
- smax = smax>0?smax+num:num;
- smin = smin<0?smin+num:num;
- if(smax>max){
- max = smax;
- }
- if(smin<min)
- min = smin;
- }
- if(sum-min>max && sum!=min)
- cout<<sum-min<<endl;
- else
- cout<<max<<endl;
- }
- //fclose(stdin);
- return 0;
- }