NOJ2045 罗马PK

来源:互联网 发布:php 二维数组去重复 编辑:程序博客网 时间:2024/06/02 11:06

题目链接:点击打开链接

罗马PK

时间限制(普通/Java) : 1000 MS/ 2000 MS          运行内存限制 : 65536 KByte
总提交 : 196            测试通过 : 49 

比赛描述

一天,机智的罗老师和小马哥想比试以下到底谁更机智,于是他们找到了一个很长的数列串,决定看谁能更快地算出这条长串中子串和的最大值。

这对于身经百战的神牛们通过编程来求解真是小菜一碟,现在想请你帮他们算出正确结果。

eg.长串为(6,-1,5,4,-7),那么子串的最大值为:

6+(-1)+5+4=14




输入

输入的第一行包含一个整数T(1<=T<=20)表示测试用例的数目。接下来有T行输入,每行以一个数N(1<=N<=100000)开头,然后接下来输入N个整数(所有的整数都在-10001000之间)。

输出

对于每个测试用例,你应该输出2行。第一行是 "Case #:"#表示测试用例数。第二行包含3个整数,子串和的最大值,对应字串的开始位置,对应字串的结束位置。如果有超过一个的答案,输出第一个。每两个测试用例之间有一个空白行。

样例输入

2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5

样例输出

Case 1:
14 1 4

Case 2:
7 1 6

解:最大连续和,和pat1007很像,自己顺便把这道题也写了,PS:这题数据出的比较水。代码:

#include<iostream>#include<cstdlib>#include<cstdio>using namespace std;int main(){    int t;    while(scanf("%d",&t)==1)    {        for(int k=1;k<=t;k++)        {            int n;            scanf("%d",&n);            int *a=new int[n+1];            for(int i=0;i<n;i++)            {                scanf("%d",&a[i]);            }            int flag=0,left=0,right=0,sum=0,cursum=0;            for(int i=0;i<n;i++)            {                if(cursum<0)                {                    cursum=a[i];                    flag=i;                }                else                {                    cursum+=a[i];                }                if(cursum>sum)                {                    sum=cursum;                    left=flag;                    right=i;                }            }            printf("Case %d:\n",k);            printf("%d %d %d\n",sum,left+1,right+1);            if(k!=t)                printf("\n");        }    }}

0 0
原创粉丝点击