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

相关文章

认识、理解、分类——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

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect