龙宫盗宝(在线算法)

题目描述

老龙王酷爱收藏宝贝,他搜罗了很多宝贝藏在他的龙宫之中。某日一小偷潜入龙宫之中企图盗窃龙宫宝物。假设宝物是被一字排列的,每个宝物都装在一个盒子里,老龙王在某些盒子里设计了一些陷阱。小偷如果拿到装有宝物的盒子,则会获得一定的收益,如果盒子里有陷阱则会有一定的损失。小偷为了尽快的拿走宝物而不被发现,决定从某个盒子开始,连续的拿走若干的盒子。问小偷从哪个盒子开始拿并且拿多少个盒子,才能使得到的收益最高。

 

输入

题目包含多组输入

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

black-hole6

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值