这个菜题不太弱

先贴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++快,没天理
posted on 2006-08-06 23:50  AnewR  阅读(145)  评论(0)    收藏  举报