SJTUOJ1006_我有一个未解之谜

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yy90163/article/details/78795319

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

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

第2..n+1行:键上的数字整数 aiai。

−100≤ai≤100−100≤ai≤100
对于70%的数据,2≤n≤1,0002≤n≤1,000
对于100%的数据,2≤n≤1,000,0002≤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

首先在这里:
最大子序列求和
学会了最大子序列求法,时间复杂度O(N):
设置一个目前最大子序列的参量和一个总体的最大子序列的参量;
如果当前最大子序列是一个负数,用当前遍历到的数字代替;
如果是一个正数,在当前最大子序列中加上当前遍历到的数字;
如果当前最大子序列大于总体的最大子序列,更新最大值。
为了与题目要求保持一致,避免最大子序列只有一个数字的情况,设置了一个bool值。初始化当前最大值时设置为false,在通过加法更新了当前最大值后设置为true。

#include<iostream>
using namespace std;
int main (void)
{
    int n,*arr;
    bool sign=false;
    cin>>n;
    arr=new int[n];
    for(int i=0;i<n;i++)
        cin>>arr[i];
    int maxnow,maxall;
    maxnow=maxall=arr[0];
    for(int i=1;i<n;i++)
    {
        if(maxnow<0)
            {
                maxnow=arr[i];
                sign=false;
            }
        else
            //maxnow>=0

            {
                maxnow+=arr[i];
                sign=true;
            }
        if(maxnow>maxall)
            maxall=maxnow;
    }
    if(maxall>=0&&sign)
        cout<<maxall;
    else
        cout<<"Game Over";
    return 0;
}

然而只有90分。说明有一种奇葩情况下是不对的。
所以我也不知道什么情况。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页