• 龙宫盗宝(在线算法)


    题目描述

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

    输入

    题目包含多组输入

    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;
    }
  • 相关阅读:
    836. Rectangle Overlap
    背包问题---01背包最优方案总数(原理剖析代码实现)
    背包问题---01背包(原理,伪代码,编程实现)
    DP---基本思想 具体实现 经典题目 POJ1160 POJ1037
    DP---(POJ1159 POJ1458 POJ1141)
    DP--HDU 1003(最大子串和)
    DP----入门的一些题目(POJ1088 POJ1163 POJ1050)
    DFS(DP)---POJ 1014(Dividing)
    博弈---斐波那契博弈
    元素相加交换另解&puts的一个用法
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781808.html
Copyright © 2020-2023  润新知