[Noip模拟题]Seq
题目描述
由于hyf长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载。有一群MM排队看hyf。每个MM都有自己独特的风格,由于hyf有着一颗包容的心,所以,什么风格的MM他都喜欢……但是,hyf有一个特别的要求,他不希望总是看到风格得差不多的MM,更加特别的是,如果两个MM风格完全一样,hyf不会有任何意见。现在,hyf希望从去看他的MM中,去掉一些MM,从而使得相邻2个MM的风格值的差(绝对值)不为1。自然地,hyf希望去掉的MM越少越好。
输入格式
第一行一个整数N;
第2~N+1行N个整数,第i个为ci。表示第i个MM的风格值。
N≤1000 0 ≤ ci ≤ 2000
输出格式
一个数,表示最少要去掉的MM数。
要去掉的数最少,也就是求最长的满足条件的序列长度。
类似于LIS的做法,我们可以用dp求解。设dp(i)表示1~i满足条件的最长序列的长度。那么可以得出状态转移方程:
\]
目标状态为dp(n)。
时间复杂度为O(N^2)。
然而dp并不是最优解,我们可以进行优化。
显然,只有当a(j)=a(i)-1或者a(j)=a(i)+1两种位置不能够进行转移。所以为了保证有解,我们只需要记三个值即可:1~i-1的dp前三大的值,并再记下其所对应的a数组的值。那么三个值里面至少一个能够对dp(i)进行转移,并且转移过来也是最优值。
时间复杂度为O(N)。
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 2001
#define inf 0x3f3f3f3f
using namespace std;
int n,a1=-inf,a2=-inf,a3=-inf,dp1,dp2,dp3;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(x=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
inline int Abs(const int &x){ return x<0?-x:x; }
int main(){
n=read();
for(register int i=1;i<=n;i++){
int cur=read(),len;
if(Abs(cur-a3)!=1) len=dp3+1;
if(Abs(cur-a2)!=1) len=dp2+1;
if(Abs(cur-a1)!=1) len=dp1+1;
if(cur==a1) dp1=len;
else if(cur==a2) dp2=len;
else if(cur==a3) dp3=len;
else if(len>dp3) a3=cur,dp3=len;
if(dp1<dp2) swap(dp1,dp2),swap(a1,a2);
if(dp1<dp3) swap(dp1,dp3),swap(a1,a3);
if(dp2<dp3) swap(dp2,dp3),swap(a2,a3);
}
printf("%d\n",n-dp1);
return 0;
}
[Noip模拟题]Seq的更多相关文章
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- NOIP模拟题17.9.26
B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...
- noip模拟题题解集
最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...
- NOIP 模拟题
目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...
- 9.22 NOIP模拟题
吉林省信息学奥赛 2017 冬令营 ...
- 6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)
Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...
随机推荐
- centos 7 安装vncserver遇到错误解决
安装网上一般的教程安装配置,略. 执行 systemctl start vncserver@:1.service 启动服务报错: Job for vncserver@:1.service failed ...
- 跟我一起学Redis之高可用从主从复制开始
前言 现在遇到高并发场景时,缓存技术应该算是性能优化的第一步,缓解数据库压力的同时还能提高访问效率,而Redis应该是绝大多数应用场景的首选.但是尽快Redis性能再优秀,在当今高并发场景下,一台服务 ...
- 一听就懂:用Python做一个超简单的小游戏
写它会用到 while 循环random 模块if 语句输入输出函数
- 详解Python Google Protocol Buffer
为什么要使用PB? PB(Protocol Buffer)是 Google 开发的用于结构化数据交换格式,作为腾讯云日志服务标准写入格式.因此用于写入日志数据前,需要将日志原始数据序列化为 PB 数据 ...
- BST和DST简单的matlab程序(图的广度和深度遍历)
图的广度和深度遍历,具体内容教材有 clc;clear all;close all; %初始化邻接压缩表compressTable=[1 2;1 3;1 4;2 4;2 5;3 6;4 6;4 7]; ...
- NET 5 收发邮件之 MailKit
大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址:https://github.com/jsted ...
- MVC中Autofac的使用
参考博文 https://www.cnblogs.com/liupeng/p/4806184.html https://blog.csdn.net/qq_37214567/article/detail ...
- [EF] - 动态创建模型:System.Reflection.Emit + Code First
动态创建Entity Framework模型并且创建数据库 使用System.Reflection.Emit+Code First model创建以下的一个实体类和DbContext并且创建数据库: ...
- Qt学习笔记-安装phonon模块
如果想要运行使用Qt中的phonon写的程序,需要满足一下条件:Qt基本库.Qt phonon库.phonon_backend(后端插件)和多媒体播放后台.下面以linux(Fedora 12)系统. ...
- java位运算符生产环境应用分析
在实际应用场景中 特别是 1,2,4,8,16 这种2的整数次幂的数字,因为具有非常典型的特点 首先是 1.2.4 这几位数了,因为他们的特点就是二进制只有一个为 1 的位,其他位都是 0,并同其他数 ...