SJTU OJ 1006. 求和游戏

本文介绍了SJTU OJ 1006题目的解题思路,这是一个求最大子序列和的游戏问题。当键盘上数字之和不为正时,输出'Game Over'。题目要求选择两个键,使得它们及中间所有键的和最大。对于70%的数据,键的数量范围是2到1000,对于100%的数据,范围扩大到2到1000000。示例输入和输出分别展示了两种情况:一种是存在正和的情况,另一种是所有数字之和为负的情况。解决方案基于‘前面遇到负数就重置’的策略,并处理特殊情况,确保子序列长度至少为2。

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

Description
石柱上有一排石头键盘,每个键上有一个整数。请你在键盘上选择两个键,使这两个键及其之间的键上的数字和最大。如果这个最大的和不为正,则输出“Game Over”。
Input Format
第1行:键的个数n。
第2..n+1行:键上的数字整数 ai。
−100≤ai≤10
对于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

这是Leetcode上一道题的变形,那道题目是不同是连续数的个数至少为1,直接扫一遍就可以了。这道题目略麻烦一些,需要增加判断连续子列长度是否至少为2。

思路是基于“前面扫过小于零就重置”的思想,再对特例进行处理。

#include<iostream>
using namespace std;

int main(){
    int n;
    cin>>n;

    int sum{};
    int ans = -1;
    bool f = false;
    int last;
    bool lastf = false;
    while(n--){
        int t;
        cin>>t;
        sum+=t;
        if (f) ans = sum>ans?sum:ans; //如果大于等于两个进行比较
        if (lastf) {
            int pair = last+t;
            ans = pair>ans?pair:ans;
        } //由于可能出现 负数 + 正数为极大值的情况,所以对每一个pair进行求和,lastf是为了避免第一个数的情况
        if(sum<0){
            sum = 0;
            f = false; 
        }
        else f = true; //如果大于等于零就留下,继续后扫
        last = t;
        lastf = true;
    }
    cout<<(ans<=0?"Game Over":to_string(ans));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值