杭电1003题

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int max_i=0,min_i=0,ma=0;
void max_son(int a[],int len){
    int k,k1,sum=0,i1=0,i2=0,flag=0;
    max_i=0;
    min_i=0;
    ma=k=-10000;
    for(int i=0;i<len;i++){
        if(a[i]>k){
            k=a[i];
            k1=i;
        }
        sum+=a[i];
        if(sum<0){
            sum=0;
            i1=i+1;
            }
        if(sum>ma){
            min_i=i1;
            max_i=i;
            ma=sum;
        }
    }
    if(ma==0&&min_i==1&&max_i==0){
        ma=k;
        min_i=max_i=k1;
    }
}
int main(void)
{
    int m,n,a[100000]={0};
    while(cin>>n){
        int x=1;
        while(x<=n){
            scanf("%d",&m);
            for(int i=0;i<m;i++)
                scanf("%d",&a[i]);
            max_son(a,m);
            printf("Case %d:\n%d %d %d\n",x,ma,++min_i,++max_i);
            if(x!=n) printf("\n");
            x++;
    }
    }
    return 0;
    }

首先遇到的一个问题是TLE 因为我用了c++的标准输入流,对于这个题目它给定的数组大小在0-100000  这意味着要输入很多数 在时间上用c的输入方法更为合适;

还一个问题是没有考虑当全为负数的情况。

还一点便是题目要求每组数据间隔一行,但要注意最后一行不要不能多隔一个

整个算法的思路是:每个数相加直到和sum<0,重新更改虚最小下标为前一位,且sum=0;期间若sum>前一个和max则将最小下标设为虚下表,最大下表设置为当前下标;

上一篇:1069 微博转发抽奖


下一篇:7.8总结