三、合唱队形

(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 合唱队列的更多相关文章

  1. P1091 合唱队列

    合唱队列 原题:传送门 核心代码: /* 方法求出每一个点的最长升子序列和最长降子序列,再加到该点上 通过循环比较哪个点最大,再用总长减去该点长度即是答案 */ #include<iostrea ...

  2. 【洛谷P1091】合唱队列

    题目大意:给定一个有 N 个正整数的序列,从其中拿走一些数,使得剩下的数满足严格单峰性,即先严格递增后严格递减,允许单调增和单调减,求最少需要拿走多少数. 题解:先考虑严格单调的情况,最少需要拿走多少 ...

  3. 洛谷 P1091合唱队列

    吾王剑之所指,吾等心之所向                           ——<Fate/stay night> 题目:https://www.luogu.org/problem/P ...

  4. (LIS) P1091 合唱队形 洛谷

    题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...

  5. NOIP 2004 合唱队形

    洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...

  6. [题解+总结]NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  7. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  8. [tem]Longest Increasing Subsequence(LIS)

    Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...

  9. [tem]最长上升子序列

    Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...

随机推荐

  1. [转]控制反转(IOC)和依赖注入(DI)

    http://blog.csdn.net/Elite_1989/article/details/16851565 控制反转和依赖注入可以理解成同一个东西,都是为解耦而生的~ 控制反转(IoC=Inve ...

  2. c++ 读写锁

    #ifndef THREAD_UTIL_H #define THREAD_UTIL_H #include <pthread.h> namespace spider { class Auto ...

  3. XoftSpy 4.13的注册算法分析

    [标题]XoftSpy 4.13的注册算法分析 [作者]forever[RCT] [语言]VC [工具]ida4.6,ollydbg1.1 [正文]       这个软件的算法很简单,正好拿来做逆向分 ...

  4. 算法导论_ch2

    Ch2算法基础 whowhoha@outlook.com 2.1 插入排序 输入:n个数的一个序列〈a1,a2,…,an〉. 输出:输入序列的一个排列〈a′1,a′2,…,a′n〉,满足a′1≤a′2 ...

  5. uva 10562

    二叉树的先序遍历  这个还是比较简单的 ~~ /************************************************************************* &g ...

  6. 简介Java反射基础

    [参考资料: 疯狂Java讲义 Chapter 18] 1.类加载.连接.初始化 当Java程序需要某一个类时,如果该类尚未加载到内存中,系统会通过加载.连接.初始化三个步骤将该类加载到内存,并完成初 ...

  7. 跟随屏幕滚动层、遮罩层、获取Div相对定位、整个屏幕、html文档的jquery基本操作

    一.层跟随屏幕滚动 <div style="width:120px;height:120px;border:1px solid red; position:absolute; left ...

  8. [杂题]FZU2190 非提的救赎

    中文题,题意不多说. 本来感觉很像dp 其实只要从上到下维护单调性就好了 坑是......这个oj......用cin很容易TLE...... //#include <bits/stdc++.h ...

  9. hhtml from表单为什么能提交数据

    1.html的列表,分为list,table,form. form表单是专门用来提交数据的,即上传数据的.所以form表单默认是必须有提交按钮的,也就是必须要有个button type类型为submi ...

  10. nginx的负载均衡和反响代理配置

    4.        负载均衡配置 nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 另外 ...