这个菜题不太弱
先贴AC的代码解恨!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p,*key;
int start,end,Fstart,t;
int n,i,x,xxx=1;
bool flag=false;
scanf("%d",&n);
int cnt;
while(n--)
{
scanf("%d",&cnt);
p = (int *)malloc(sizeof(int)*cnt);
key = (int *)malloc(sizeof(int)*cnt);
i=0;
while(cnt--)
{
scanf("%d",&p[i]);
++i;
}
int mh,ms;
Fstart=start=end=mh=ms=0;
for(x=0;x<i;++x)
{
if(mh+p[x]>=0)
{
mh+=p[x];
}
else
{
Fstart = x+1;
mh=0;
}
if(mh>ms)
{
start = Fstart;
ms=mh;
end=x;
}
}
if(ms==0)
{
t = p[0];
start=end=0;
for(x=1;x<i;++x)
if(p[x]>t)
{
start = end = x;
t = p[x];
}
ms = t;
}
if(flag==false)
flag=true;
else
printf("\n");
printf("Case %d:\n%d %d %d\n",xxx,ms,start+1,end+1);
xxx++;
free(key);
free(p);
}
return 0;
}
气死我了!
不就是个最大子向量么,搞了5个多小时!FUCKING TO DEATH
怎么说俺也是校队的啊,可是一个烂OJ上AC率那么高的题,本来打算三分中搞定的,居然……
先以为是O(N^2)的弱题,结果超时
考虑到效率,用了Programming Pearls 上的线性算法,发现只能求出最后值,下标没法弄,然后想了个办法得到下标
提交 WA
检查数据,检查了半个多小时,没查到
后来自己输测试数据,不小心打错了,却正好发现元素都是负的的时候值为0,马上看书,果然,先就看那个
max(maxendinghere + x[i], 0)很不爽……
还是怨自己没看明白就乱搞啊。
又得考虑特殊情况啊,想,再想,越想越复杂,硬是考虑不完全,我的IQ低……
实在是搞不定了,休息了会儿
看蜡笔小新……
上网,还真查到关于那个线性算法的东西了,也没玩出什么花样来。
把那本书带的程序下下来看了,咦?也没有那么复杂的考虑正负交替嘛,经典难道也是不全?---?
不过还是怀疑了一下自己,把自己的特殊处理全清掉,果然,除了全是负值之外都没错,是我的烂代码,让原本强壮的代码出错了,唉,失败。
既然没错,那只单独考虑为0的情况好了,结果,AC
PS:HOJ上用VC++提交居然比GUNC++快,没天理
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p,*key;
int start,end,Fstart,t;
int n,i,x,xxx=1;
bool flag=false;
scanf("%d",&n);
int cnt;
while(n--)
{
scanf("%d",&cnt);
p = (int *)malloc(sizeof(int)*cnt);
key = (int *)malloc(sizeof(int)*cnt);
i=0;
while(cnt--)
{
scanf("%d",&p[i]);
++i;
}
int mh,ms;
Fstart=start=end=mh=ms=0;
for(x=0;x<i;++x)
{
if(mh+p[x]>=0)
{
mh+=p[x];
}
else
{
Fstart = x+1;
mh=0;
}
if(mh>ms)
{
start = Fstart;
ms=mh;
end=x;
}
}
if(ms==0)
{
t = p[0];
start=end=0;
for(x=1;x<i;++x)
if(p[x]>t)
{
start = end = x;
t = p[x];
}
ms = t;
}
if(flag==false)
flag=true;
else
printf("\n");
printf("Case %d:\n%d %d %d\n",xxx,ms,start+1,end+1);
xxx++;
free(key);
free(p);
}
return 0;
}
气死我了!
不就是个最大子向量么,搞了5个多小时!FUCKING TO DEATH
怎么说俺也是校队的啊,可是一个烂OJ上AC率那么高的题,本来打算三分中搞定的,居然……
先以为是O(N^2)的弱题,结果超时
考虑到效率,用了Programming Pearls 上的线性算法,发现只能求出最后值,下标没法弄,然后想了个办法得到下标
提交 WA
检查数据,检查了半个多小时,没查到
后来自己输测试数据,不小心打错了,却正好发现元素都是负的的时候值为0,马上看书,果然,先就看那个
max(maxendinghere + x[i], 0)很不爽……
还是怨自己没看明白就乱搞啊。
又得考虑特殊情况啊,想,再想,越想越复杂,硬是考虑不完全,我的IQ低……
实在是搞不定了,休息了会儿
看蜡笔小新……
上网,还真查到关于那个线性算法的东西了,也没玩出什么花样来。
把那本书带的程序下下来看了,咦?也没有那么复杂的考虑正负交替嘛,经典难道也是不全?---?
不过还是怀疑了一下自己,把自己的特殊处理全清掉,果然,除了全是负值之外都没错,是我的烂代码,让原本强壮的代码出错了,唉,失败。
既然没错,那只单独考虑为0的情况好了,结果,AC
PS:HOJ上用VC++提交居然比GUNC++快,没天理
浙公网安备 33010602011771号