1226-求和游戏(最大子序列和) ZCMU

本文介绍了一种算法,用于解决给定一系列带有数值的球,找出两个球之间的最大数字和的问题。该算法通过扫描整个序列并跟踪当前和及最大和来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

小明有n个球排成一行,每个球上有个数字。现在小明选择两个球,使这两个球之间的数字和最大(包括这两个球)。如果这个最大的和不为正,则输出“Game Over”。

Input

第一行输入T,有T组数据。

每组数据:输入n(1<n<1000000 ),再输入n个整数,表示第1个球到第n个球上的数字,每个球上的数字大于-100,小于100。

Output

对于每组数据,输出最大和或者”Game Over“,占一行。

Sample Input

6

5

3 -5 7 -2 8

3

-1 2 3

4

-1 1 -111 1111

3

-1 -2 -3

3

1 -1 0

6

100 -1 -1 -1 -1 -1 -1

Sample Output

13

5

1001

Game Over

Game Over

99

解析

求最大子序列,但题目要求至少要有两个元素,所以在求出的最大子序列只有一个元素的时候,还要再处理

代码

#include<stdio.h>
#include<algorithm>
#define MAX 1000005
using namespace std;
int num[MAX];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,i;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
        }
        int sum=0,maxsum=-1000,st,ed,count=1;
        for(i=1;i<=n;i++)
        {
            sum+=num[i];
            if(sum>maxsum)
            {
                maxsum=sum; ed=i; st=count;
            }
            if(sum<=0)
            {
                sum=0; count=i+1;
            }
        }
       if(maxsum<=0)
          printf("Game Over\n");
        else
        {
            if(ed==1)
            {
                if(maxsum+num[ed+1]>0)
                    printf("%d\n",maxsum+num[ed+1]);
                else
                    printf("Game Over\n");
            }
            else if(ed-st==0)
            {
                int max1=0,max2=0;
                if(st-2>=1)
                    max1=max(max1+num[st-1],max1+num[st-1]+num[st-2]);
                else
                    max1=num[st-1];
                if(ed!=n)
                {
                    if(ed-2<=n)
                       max2=max(max2+num[ed+1],max2+num[ed+1]+num[ed+2]);
                    else
                       max2=num[ed+1];
                }
                else
                    max2=-1000;
                int Max=max(max1,max2);
                if(maxsum+Max>0)
                    printf("%d\n",maxsum+Max);
                else
                    printf("Game Over\n");
            }
            else
                printf("%d\n",maxsum);
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值