当前位置: 首页 > news >正文

TYVJ P1067 合唱队形 Label:上升子序列?

背景

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[105],b[105],dp[105],f[105],l,r;
int longest(int k){
    fill(dp,dp+N,INF);
    for(int i=1;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=1;i<=N-k+1;i++){
        *lower_bound(dp,dp+N,b[i])=b[i];
        if(i==N-k+1) r=lower_bound(dp,dp+N,INF)-dp;
    }
//    printf("r=%d\n",r);
    if(r==1||l==1) return -1;
    return l+r-1;
}
int main(){
//    freopen("01.txt","r",stdin);
    scanf("%d",&N);
    for(int i=1;i<=N;i++) scanf("%d",&a[i]);
    for(int i=1;i<=N;i++) b[i]=a[N-i+1];
//    for(int i=1;i<=N;i++) printf("%d ",b[i]);
    
    for(int i=1;i<=N;i++){
        int k=longest(i);
        if(k==-1) k=INF;
        else k=N-k;
        res=min(res,k);
    }
    
    if(res==INF) res=0;
    printf("%d\n",res);
    return 0;
}

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

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

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

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

非二分做法如下

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #define inf 0x3f3f3f3f
 6 using namespace std;
 7 int a[10005],zuo[10005],you[10005],N;
 8 int zuo_(){
 9     fill(zuo,zuo+10000,1);
10     for(int i=1;i<=N;i++){
11         for(int j=i+1;j<=N;j++){
12             if(a[j]>a[i]) zuo[j]=max(zuo[j],zuo[i]+1);
13         }
14     }
15 }
16 int you_(){
17     fill(you,you+10000,1);
18     for(int i=N;i>=1;i--){
19         for(int j=i-1;j>=1;j--){
20             if(a[j]>a[i]) you[j]=max(you[j],you[i]+1);
21         }
22     }
23 }
24 int main(){
25     freopen("01.txt","r",stdin);
26     scanf("%d",&N);
27     for(int i=1;i<=N;i++)
28         scanf("%d",&a[i]);
29     
30     zuo_();
31     you_();
32     int ans=0;
33 
34     
35     for(int i=1;i<=N;i++)
36         ans=max(ans,zuo[i]+you[i]-1);
37     if(ans==1) puts("0");
38     else printf("%d\n",N-ans);
39     return 0;
40 }
View Code

 

转载于:https://www.cnblogs.com/radiumlrb/p/5782557.html

相关文章:

  • 使用有源匹配电路改善宽带全差分放大器的噪声性能
  • 关于JavaScript初级的知识点一(持续更新 )
  • Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析
  • Linux下创建软RAID5和RAID10实战
  • 【原创】遨游springmvc之HandlerMethodReturnValueHandler
  • css 样式表分类总结
  • Babel6.x 转换ES6
  • SharpGL学习笔记(五) 视口变换
  • win2012配置
  • shell运算(加、减、乘、除)
  • 配置 linux-bridge mechanism driver - 每天5分钟玩转 OpenStack(77)
  • Android listview的item设定高度
  • 解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
  • Spring注解解释(@Primary、@Qualifier)
  • storm-kafka(storm spout作为kafka的消费端)
  • [译] 怎样写一个基础的编译器
  • ES10 特性的完整指南
  • Javascripit类型转换比较那点事儿,双等号(==)
  • js学习笔记
  • KMP算法及优化
  • Linux Process Manage
  • maya建模与骨骼动画快速实现人工鱼
  • mysql中InnoDB引擎中页的概念
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • spring boot 整合mybatis 无法输出sql的问题
  • uni-app项目数字滚动
  • vue 个人积累(使用工具,组件)
  • vuex 学习笔记 01
  • 飞驰在Mesos的涡轮引擎上
  • 记一次和乔布斯合作最难忘的经历
  • 类orAPI - 收藏集 - 掘金
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 入门级的git使用指北
  • 深入 Nginx 之配置篇
  • 系统认识JavaScript正则表达式
  • 责任链模式的两种实现
  • ​2020 年大前端技术趋势解读
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #define 用法
  • #LLM入门|Prompt#3.3_存储_Memory
  • #QT(一种朴素的计算器实现方法)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (07)Hive——窗口函数详解
  • (5)STL算法之复制
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .jks文件(JAVA KeyStore)
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Framework 服务实现监控可观测性最佳实践