SJTUOJ 1006. 求和游戏

本文深入探讨了一种求解最大子数组和的算法,特别关注于如何在给定的石头键盘上找到两个键,使得这两键及其间的键上数字之和最大。通过前缀和的概念,文章详细阐述了解决方案的实现细节,并提供了具体的代码示例。

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

问题内容

Description
石柱上有一排石头键盘,每个键上有一个整数。请你在键盘上选择两个键,使这两个键及其之间的键上的数字和最大。如果这个最大的和不为正,则输出“Game Over"。

Input Format
第1行:键的个数n。

第2…n+1行:键上的数字整数 ai。

−100≤ai≤100
对于70%的数据,2≤n≤1,000
对于100%的数据,2≤n≤1,000,000
Output Format
一行,最大和或者”Game Over"。

Sample Input
5
3
-5
7
-2
8
Sample Output
13
Sample Input
3
-6
-9
-10
Sample Output
Game Over

代码实现及分析

又一题前缀和,需要注意的就是题目限制了间隔最小为2,Hint提到的增强可能就是值这样一组数据,不加这个限制会有一组数据WA。

#include <stdio.h>
int main()
{
    int curSum; // 当前最大序列前缀和
    int minSum; //当前最小前缀和
    int resultSum; //已知最大序列和,即curSum-minSum最大值   
    int input,n,pre;
    while(scanf("%d",&n)!=EOF)
    {
        scanf("%d",&input);
        minSum = 0;
        curSum = input;
        pre = input;
        resultSum = 0;
        n--;
        while(n--){
            scanf("%d",&input);
            curSum += input;
            resultSum = resultSum > (curSum-minSum) ? resultSum : (curSum - minSum);
            minSum = minSum < (curSum - input - pre) ? minSum : (curSum - input - pre);
            pre = input;
        }
        if(resultSum > 0){
            printf("%d\n",resultSum);
        }
        else{
            puts("Game Over");
        }
    }
    return 0;
}

时间:731ms 空间:9060kb

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值