NYOJ983 http://acm.nyist.net/JudgeOnline/problem.php?pid=983
看完题就想着把数组扩大二倍存下a[i+n]=a[i],然后求连续子序列最大和时标记下位置,让长度不超过n,交上去wa,感觉没有想法错,然后就问了队友怎么做,她是求了个连续子序列的最大和,最小和,比较sum-min和max取个最大的,这样确实不错,但还是不知道自己的想法错哪里了,就去看了下讨论区,大家都是这样的写法,看到有人说和 754 蚂蚁的难题(二) 差不多就看了下,这题的第一个样例都过不了瞬间发现哪里错了,也没法改,看来想法不可行。
这两题思路很好:求个连续最大和,连续最小和(总和-连续最小和=除去连续最小和那段其他首尾相连的和),比较下去最大即可,
code:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int a[200005];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
int sum=0,minn=inf,maxx=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
if(sum<0)
{
sum=0;
}
maxx=max(maxx,sum);
}
sum=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
if(sum>0)
{
sum=0;
}
minn=min(minn,sum);
}
sum=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
}
printf("%d\n",max(maxx,sum-minn));
}
}
NYOJ754 蚂蚁的难题(二) http://acm.nyist.net/JudgeOnline/problem.php?pid=745
这题范围较大超出int要用long long 因为没注意wa了几遍,不过数据较水没考虑全为负的情况输出0或最大的都能过