背景

NOIP2004 提高组 第三道

描述

    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包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

测试样例1

输入

8 
186 186 150 200 160 130 197 220

输出

4

备注

对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1<<30
using namespace std;
int N,res=INF,a[],b[],dp[],f[],l,r;
int longest(int k){
fill(dp,dp+N,INF);
for(int i=;i<=k;i++){
*lower_bound(dp,dp+N,a[i])=a[i];
if(i==k) l=lower_bound(dp,dp+N,INF)-dp;
}
// printf("k=%d l=%d ",k,l);
fill(dp,dp+N,INF);
for(int i=;i<=N-k+;i++){
*lower_bound(dp,dp+N,b[i])=b[i];
if(i==N-k+) r=lower_bound(dp,dp+N,INF)-dp;
}
// printf("r=%d\n",r);
if(r==||l==) return -;
return l+r-;
}
int main(){
// freopen("01.txt","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++) scanf("%d",&a[i]);
for(int i=;i<=N;i++) b[i]=a[N-i+];
// for(int i=1;i<=N;i++) printf("%d ",b[i]); for(int i=;i<=N;i++){
int k=longest(i);
if(k==-) k=INF;
else k=N-k;
res=min(res,k);
} if(res==INF) res=;
printf("%d\n",res);
return ;
}

直接顺序读入a数组,再逆序复制一份到b,枚举中间点,过一下最长上升子序列,

记录当中间点推入时的序列长度,得到最小值;

其实可以不用逆序复制,为了不浪费时间,采用了O(nlogn)的lower_bound;

看了下题解发现本来就是上升或下降(即没有答案时)要输出0

非二分做法如下

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
int a[],zuo[],you[],N;
int zuo_(){
fill(zuo,zuo+,);
for(int i=;i<=N;i++){
for(int j=i+;j<=N;j++){
if(a[j]>a[i]) zuo[j]=max(zuo[j],zuo[i]+);
}
}
}
int you_(){
fill(you,you+,);
for(int i=N;i>=;i--){
for(int j=i-;j>=;j--){
if(a[j]>a[i]) you[j]=max(you[j],you[i]+);
}
}
}
int main(){
freopen("01.txt","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++)
scanf("%d",&a[i]); zuo_();
you_();
int ans=; for(int i=;i<=N;i++)
ans=max(ans,zuo[i]+you[i]-);
if(ans==) puts("");
else printf("%d\n",N-ans);
return ;
}

TYVJ P1067 合唱队形 Label:上升子序列?的更多相关文章

  1. tyvj 1067 合唱队形 dp LIS

    P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述     N位同学站成一排,音乐老师要请其中的(N ...

  2. NOIP200407合唱队形+最长上升子序列O(n^2)详解

    合唱队形解题报告 2016-05-12   4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...

  3. NOIP 2004 T3 合唱队形(DP、最长上升/下降子序列)

    链接:https://ac.nowcoder.com/acm/contest/1082/C来源:牛客网 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队 ...

  4. 九度OJ 1131 合唱队形 -- 动态规划(最长递增子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1131 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合 ...

  5. 洛谷 P1091 合唱队形

    \[传送门在这里呀\] 题目描述 \(N\)位同学站成一排,音乐老师要请其中的\((N-K)\)位同学出列,使得剩下的\(K\)位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次 ...

  6. 洛谷p1091合唱队形题解

    题目 合唱队形首先要满足的是从1这个位置到中间任意的位置为单增的,从中间任意的位置到最后是单减的,且长度最长.这样才能满足出列的同学最少. 如果要满足这个条件那么我们可以先预处理出每个点的从前找的最长 ...

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

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

  8. JOBDU 题目1131:合唱队形

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4546 解决:1445 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. ...

  9. vijos 1098 合唱队形 - 动态规划

    描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...

随机推荐

  1. BestCoder Round #60 1002

    Problem Description You are given two numbers NNN and MMM. Every step you can get a new NNN in the w ...

  2. linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

  3. iOS 在使用UINavigationController和TabBarController时view的frame

    可能是以前记错了,总认为在ios6上使用了UINavigationController或者TabBarController会因为多了bar而影响子controller的view的frame大小.今天在 ...

  4. Android drawable的自动缩放

    今天在写程序时发现,一张图片被自动放大了,后来发现,这张图片放在了drawable-zh文件夹下,这个文件夹没有指定屏幕密度!于是将drawable-zh改为drawable-zh-nodpi,问题解 ...

  5. Java for LeetCode 142 Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  6. Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用

    新生代.老年代.永久代的概念不多说,这三个空间中任何一个不能满足内存分配请求时,就会发生垃圾收集. 新生代不满足内存分配请求时,发生Minor GC,老年代.永久代不满足内存分配请求时,发生Full ...

  7. python scrapy cannot import name xmlrpc_client的解决方案,解决办法

    安装scrapy的时候遇到如下错误的解决办法: "python scrapy cannot import name xmlrpc_client" 先执行 sudo pip unin ...

  8. July 22nd, Week 30th Friday, 2016

    Love means never having to say you are sorry. 爱就是永远不必说对不起. Love means knowing each other deeply, the ...

  9. Java 批量反编译class文件,并保持目录结构

    jad -o -r -d d:\src -s java C:\Users\spring\Desktop\egorder3.0\WEB-INF\classes\**\*.class -o - overw ...

  10. ping 有端口的ip

    使用工具 tcping 使用方法,将此工具放在C:/Windows/System32 目录下, 在cmd 中: tcping 127.0.0.1 8080