题目描述
老龙王酷爱收藏宝贝,他搜罗了很多宝贝藏在他的龙宫之中。某日一小偷潜入龙宫之中企图盗窃龙宫宝物。假设宝物是被一字排列的,每个宝物都装在一个盒子里,老龙王在某些盒子里设计了一些陷阱。小偷如果拿到装有宝物的盒子,则会获得一定的收益,如果盒子里有陷阱则会有一定的损失。小偷为了尽快的拿走宝物而不被发现,决定从某个盒子开始,连续的拿走若干的盒子。问小偷从哪个盒子开始拿并且拿多少个盒子,才能使得到的收益最高。
输入
题目包含多组输入
n表示有n个盒子(n<=1000000),随后n个数表示每个盒子能带来的收益val,(-100<=val<=100)。
输出
输出两个值小偷拿的第一个盒子的位置i(从1开始数),拿走盒子的个数k。中间用空格隔开。如果有多种结果,要求在i尽量小的前提下k尽量大(因为小偷很贪心,他总想多拿一点,当然知晓老龙王阴险的他也可以一个都不拿并输出"23333333")。
样例输入
5 -1 2 3 -2 4
样例输出
2 4
提示
选择 2 3 -2 4
思路:求最大子序列和
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
int N,x;
int main() {
while(~scanf("%d", &N)) {
ll sum=0;
ll maxsum=0;
int pos=1,tpos=1,k=0,s=0;
for(int t=1; t<=N; t++) {
scanf("%d",&x);
sum+=x;
if(sum<0) {
tpos=t+1;
sum=0;
k=0;
} else {
k++;
}
if(sum>maxsum) {
maxsum=sum;
pos=tpos;
s=k;
}
if(sum==maxsum&&pos==tpos) {
s=k;
}
}
if(maxsum>=0) {
cout<<pos<<" "<<s<<endl;
} else {
cout<<"23333333"<<endl;
}
}
return 0;
}