其他分享
首页 > 其他分享> > 美团笔试-回转寿司

美团笔试-回转寿司

作者:互联网

小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。

输入:

第一行输入一个整数T(1<=T<=10),表示数据组数。
每组数据占两行,第一行输入一个整数N(1<=N<=10^5);
第二行输入N个由空格隔开的整数,表示A[1]到A[N](-104<=A[i]<=104)。

输出:

每组数据输出占一行,输出一个整数,表示连续若干盘寿司的美味值之和的最大值

输入例子

1
4
3 -2 4 -1

输出例子

6

第一思路是用两层循环,但是超时, python不会。
第二思路如下: 可能的组合是:前缀和-前缀和最小值(0或者负数); 前缀和+以最后一个数字结尾的最大和子数组。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        vector<int>num;
        for(int i = 0; i <n; i++){
            int a;
            cin>>a;
            num.push_back(a);
        }
        vector<int>pre(n+1, 0);
        vector<int>pre_min(n+1,0);
        vector<int>suf_max(n+1, 0);
        vector<int>suf(n+1,0);
        int mins = 0, maxs = 0, res = 0;
        for(int i = 0; i < n; i++){
            pre[i+1] = pre[i] + num[i];
            mins = min(mins, pre[i+1]);
            pre_min[i+1] = mins;
        }
        for(int i = n-1; i >= 0; i--){
            suf[i] = suf[i+1] + num[i];
            maxs = max(maxs, suf[i]);
            suf_max[i] = maxs;
        }
        for(int i = 0; i < n; i++){
            res = max(res, max(pre[i+1] - pre_min[i+1], pre[i+1] + suf_max[i+1]));
        }
        cout<<res<<endl;
    }
    return 0;
}

标签:pre,suf,寿司,int,max,美团,笔试,小团
来源: https://blog.csdn.net/zhaoxiaoba/article/details/114048602