美团笔试-回转寿司
作者:互联网
小美请小团吃回转寿司。转盘上有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