ACM-ICPC 2017 南宁赛区网络预赛 L The Heaviest Non-decreasing Subsequence Problem 【最长非递减子序列的变形】

本文主要是介绍ACM-ICPC 2017 南宁赛区网络预赛 L The Heaviest Non-decreasing Subsequence Problem 【最长非递减子序列的变形】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  •  1000ms
  •  131072K

Let S be a sequence of integers s1​, s2​, ......, sn​ Each integer is associated with a weight by the following rules:

(1) If is negative, then its weight is 0.

(2) If is greater than or equal to 10000, then its weight is 5. Furthermore, the real integer value of si​ is -10000. For example, if si​ is 10101, then is is reset to 101 and its weight is 5.

(3) Otherwise, its weight is 1.

A non-decreasing subsequence of S is a subsequence si1​, si2​, ......,sik​, with i1​<i2​ ... <ik​, such that, for all 1≤j<k, we have sij​<sij+1​.

A heaviest non-decreasing subsequence of SS is a non-decreasing subsequence with the maximum sum of weights.

Write a program that reads a sequence of integers, and outputs the weight of its

heaviest non-decreasing subsequence. For example, given the following sequence:

80 75 73 93 73 73 10101 97 −1 −1 114 −1 10113 118

The heaviest non-decreasing subsequence of the sequence is <73, 73, 73, 101, 113, 118>with the total weight being 1+1+1+5+5+1 = 14. Therefore, your program should output 1414 in this example.

We guarantee that the length of the sequence does not exceed 2∗10^5

Input Format

A list of integers separated by blanks:s1​, s2​,......,sn​

Output Format

A positive integer that is the weight of the heaviest non-decreasing subsequence.

样例输入

80 75 73 93 73 73 10101 97 -1 -1 114 -1 10113 118

样例输出

14

题目来源

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

题目大意:给定一个整数序列,每个整数有一个权值,负数的权值为0,大于等于10000的数要减去10000,其权值为5,其他数的权值为1。问这个整数序列的最长非降子序列中权值最大为多少

题解:最长非降子序列的变形,由于权值不大,因此把权值5的数重复5次,把权值为0的负数忽略,这样答案就是新整数序列的最长非降子序列,就可以使用O(nlogn)的算法。

程序说明:upper_bound(q1,q2,x)函数返回有序区间 [q1,q2)中第一个大于x的数的迭代器,如果没有则返回q2。程序没有存储元素,这样更节省内存

AC的C++代码:

#include<iostream>
#include<algorithm>using namespace std;const int N=200005;
int b[N],len;int main()
{int x,n;while(scanf("%d",&x)!=EOF){n=1;if(x<0)continue;else if(x>=10000){x-=10000;n=5;	}for(int i=1;i<=n;i++){if(len==0||x>=b[len-1])b[len++]=x;else{int k=upper_bound(b,b+len,x)-b; b[k]=x;}}}printf("%d\n",len);return 0;
} 

 

这篇关于ACM-ICPC 2017 南宁赛区网络预赛 L The Heaviest Non-decreasing Subsequence Problem 【最长非递减子序列的变形】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626495

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu3389(阶梯博弈变形)

题意:有n个盒子,编号1----n,每个盒子内有一些小球(可以为空),选择一个盒子A,将A中的若干个球移到B中,满足条件B  < A;(A+B)%2=1;(A+B)%3=0 这是阶梯博弈的变形。 先介绍下阶梯博弈: 在一个阶梯有若干层,每层上放着一些小球,两名选手轮流选择一层上的若干(不能为0)小球从上往下移动,最后一次移动的胜出(最终状态小球都在地面上) 如上图所示,小球数目依次为

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring