NOIP2004 合唱队列
三、合唱队形
(chorus.pas/dpr/c/cpp)
【问题描述】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出文件】
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【数据规模】
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。
【思路】
线性DP。
正反向各求一遍最长严格上升子序列得到d[]g[],通过枚举至高点可以得出剩下人数的最大值。
【代码】
#include<iostream>
using namespace std; const int maxn = +;
int d[maxn],g[maxn],A[maxn];
int n; int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<n;i++) cin>>A[i];
for(int i=;i<n;i++) {
d[i]=;
for(int j=;j<i;j++) if(A[j]<A[i])
d[i]=max(d[i],d[j]+);
}
for(int i=n-;i>=;i--) {
g[i]=;
for(int j=i+;j<n;j++) if(A[i]>A[j])
g[i]=max(g[i],g[j]+);
}
int ans=;
for(int i=;i<n;i++) ans=max(ans,d[i]+g[i]-); //枚举至高点
cout<<n-ans;
return ;
}
优化:
二分加速寻找最优子问题。时间复杂度为O(nlogn),数据范围小所以加速效果不是很明显。
1、手写二分比algorithm中的二分快。
2、memset比fill快。
#include<iostream>
#include<cstring>
using namespace std; const int maxn=;
const int INF=<<; int d[maxn],g[maxn],t[maxn];
int A[maxn],n; //严格上升 inline int lower_bound(int l,int r,int k) {
int m;
while(l<r) {
int m=l+(r-l)/;
if(k <= t[m]) r=m;
else l=m+;
}
return l;
}
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++) cin>>A[i];
memset(t,,sizeof(t));
for(int i=;i<=n;i++) {
d[i]=lower_bound(,n+,A[i]);
t[d[i]]=A[i];
} memset(t,,sizeof(t));
for(int i=n;i;i--) {
g[i]=lower_bound(,n+,A[i]);
t[g[i]]=A[i];
} int ans=;
for(int i=;i<=n;i++) ans=max(ans,d[i]+g[i]-);
cout<<n-ans;
return ;
}
NOIP2004 合唱队列的更多相关文章
- P1091 合唱队列
合唱队列 原题:传送门 核心代码: /* 方法求出每一个点的最长升子序列和最长降子序列,再加到该点上 通过循环比较哪个点最大,再用总长减去该点长度即是答案 */ #include<iostrea ...
- 【洛谷P1091】合唱队列
题目大意:给定一个有 N 个正整数的序列,从其中拿走一些数,使得剩下的数满足严格单峰性,即先严格递增后严格递减,允许单调增和单调减,求最少需要拿走多少数. 题解:先考虑严格单调的情况,最少需要拿走多少 ...
- 洛谷 P1091合唱队列
吾王剑之所指,吾等心之所向 ——<Fate/stay night> 题目:https://www.luogu.org/problem/P ...
- (LIS) P1091 合唱队形 洛谷
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...
- NOIP 2004 合唱队形
洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...
- [题解+总结]NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- [tem]Longest Increasing Subsequence(LIS)
Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...
- [tem]最长上升子序列
Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...
随机推荐
- Mapped Statements collection does not contain value for
这是由pojo的映射文件的命名空间引起的错误. 按照以下格式即可:命名空间中一定要含有mapper.xxMapper这样的格式,否则出现以上错误. <?xml version="1.0 ...
- FireFly 服务端 Unity3D黑暗世界 客户端 问题
启动服务端成功截图: 连接成功截图: 测试服务端是否启动成功: 在Web输入:http://localhost:11009/ 按回车 (查看cmd启动的服务端 是否多出如下显示) 服务端启动成功.P ...
- jvisualvm 使用
和jconsole侧重于内存分析和检测不同,jvisualvm在线程分析方面更强大一些,下面简单介绍下使用: 1. 在要监控的java应用配置文件中,本例是apache-jmeter/bin/jmet ...
- QxtFlowView(libqxt)
https://github.com/mnutt/libqxt/tree/master/examples http://libqxt.bitbucket.org/doc/0.5/class_qxt_f ...
- Android安全问题 抢先接收广播 - 内因篇之广播发送流程
导读:本文说明系统发送广播的部分流程,如何利用Intent查找到对应接收器.我们依然只关注接收器的排序问题 这篇文章主要是针对我前两篇文章 android安全问题(四) 抢先开机启动 - 结果篇 an ...
- eclipse如何导入PHP的项目
http://zhidao.baidu.com/link?url=2jvsgawRlEWzE63-Wm-e51_Nl0dWH1Z4z5VS_s2E824y2fYqsvNzdZ8GfEh6DOVtjY8 ...
- 【剑指offer】求逆序对的个数
2013-09-07 10:50:31 面试题36:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对.输入一个数组,求出这个数组中逆序对的总数. 小结: 最直观的的方法是: ...
- 利用VC/VS的安装目录找到C/C++库函数实现的源代码
2013-07-03 20:08:57 大多开发软件的装目录下都有很多有价值的东西,比如help文档.user guide.src文件等.今天在VS的安装目录下发现了库函数的源文件,这些文件中有对所有 ...
- String Split 和 Join
很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能需要加入分隔符(如CSV文件中的逗号),或使用一个分隔符来合并字符串序列. 很多人都知道使用split()的方法,但使用与其对应的Join ...
- CentOS升级git
1.首先查看下当前的版本 [root@localhost ~]# git --versiongit version 1.8.2.1 2.尝试进行升级 [root@localhost ~]# yum u ...