背景

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

输入


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. poj2996 模拟

    Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3713   Accepted:  ...

  2. PHP 逻辑思维题

    约瑟夫环 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止 ...

  3. Junit4测试

    1.junit初级入门 2.常用注解 3.运行流程 4.测试套件使用 5.参数化设置

  4. Convert Sorted List to Balanced BST

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  5. Java for LeetCode 148 Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 解题思路: 归并排序.快速排序.堆排序都是O(n log ...

  6. Java for LeetCode 065 Valid Number

    Validate if a given string is numeric. Some examples: "0" => true " 0.1 " =&g ...

  7. springMVC controller间跳转、重定向、传参

    转载自:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/   1. 需求背景     需求:spring MVC框架co ...

  8. oracle通过plsql导入dmp数据文件

    首先安装Oracle,新建一个空的数据库mydb 从开始菜单运行cmd控制台:sqlplus "用户名/密码@数据库名 as sysdba"//例如sqlplus sys/admi ...

  9. 食物链(codevs 1074)

    题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...

  10. Ubuntu 下搭建SVN服务器

    root@iZ25q0jd99eZ:~# sudo apt-get install subversion root@iZ25q0jd99eZ:/etc/subversion# mkdir /svn r ...