计算最少出列多少位同学,使得剩下的同学排成合唱队形

说明:

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得Ti<T2<......<Ti-1<Ti>Ti+1>......>TK。 
     你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入

整数N

一行整数,空格隔开,N位同学身高

输出

最少需要几位同学出列

样例输入 8 186 186 150 200 160 130 197 200
样例输出 4

这个问题实际就是在求一个最长递增子序列,和最长递减子序列的问题,对应求和找到最大的那个temp=arrayLenUp[i]+arrayLenDown[N-1-i];,即是合唱队的长度-1。

Java代码:通过

import java.util.Scanner;

public class Main {

    public static void main(String[] args){

        Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个整数:");
int N=scanner.nextInt();
int[] height=new int[N];
for (int i = 0; i < N; i++) {
height[i]=scanner.nextInt();
}
Main main=new Main();
int[] arrayLenUp=main.getLISUp(height);
for(int i:arrayLenUp)
System.out.print(i+",");
System.out.println();
int[] arrayLenDown=main.getLISDown(height);
for(int i:arrayLenDown)
System.out.print(i+",");
System.out.println();
int total=2;
int temp;
for (int i = 0; i < N; i++) { //对应求和找到最大的那个
temp=arrayLenUp[i]+arrayLenDown[N-1-i];
if (temp>total) {
total=temp;
}
}
System.out.println((N-total+1)); //输出最终结果
scanner.close(); } public int binarySearchPosition(int arrayOut[],int left,int right,int key){ //二分查找要替换的位置 int mid; if (arrayOut[right]<key) {
return right+1;
}else {
while(left<right){
mid=(left+right)>>1;
if (arrayOut[mid]<key) {
left=mid+1;
}else {
right=mid;
}
}
return left;
} } public int[] getLISUp(int[] arrayIn){ //获取最长递增子序列并把它们保存在数组arrayLen中 int len=1;
int position;
int[] arrayOut=new int[arrayIn.length+1];
arrayOut[1]=arrayIn[0];
int[] arrayLen=new int[arrayIn.length];
arrayLen[0]=1;
for (int i = 1; i < arrayIn.length; i++) {
position=binarySearchPosition(arrayOut, 1, len, arrayIn[i]);
arrayOut[position]=arrayIn[i];
if (position>len) {
len=position;
}
arrayLen[i]=position;
}
return arrayLen;
} public int[] getLISDown(int[] arrayIn){ ////获取最长递减子序列并把它们保存在数组arrayLen中
int[] arrayReverse=new int[arrayIn.length];
int[] arrayLen=new int[arrayIn.length];
for (int i = 0; i < arrayReverse.length; i++) { //将最长递减子序列问题转换为最长递增子序列问题
arrayReverse[i]=arrayIn[arrayIn.length-1-i];
}
arrayLen=getLISUp(arrayReverse);
return arrayLen;
} }

C代码:没有通过

#include "iostream"  

#include "stdio.h"  

#include "math.h"  

#include "vector"  

#include "queue"  

#include "memory.h"  

#include "algorithm"  

#include "string"  

using namespace std;  

int inc1[200],inc2[200],a[200];  

//inc1-->longest increase array from head to tail  

//inc2-->longest increase array from tail to head  

int main()  

{  

    int n;  

    while(scanf("%d",&n)!=EOF)  

    {  

        int ans=0,i,j;  

        for(i=1;i<=n;i++)  

            scanf("%d",&a[i]);  

        inc1[1]=1;  

        for(i=2;i<=n;i++)  

        {  

            inc1[i]=1;  

            for(j=1;j<i;j++)  

                if(a[i]>a[j]&&inc1[j]+1>inc1[i])  

                    inc1[i]=inc1[j]+1;  

        }  

        inc2[n]=1;  

        for(i=n-1;i>=1;i--)  

        {  

            inc2[i]=1;  

            for(j=n;j>i;j--)  

                if(a[j]<a[i]&&inc2[j]+1>inc2[i])  

                    inc2[i]=inc2[j]+1;  

        }  

        for(i=1;i<=n;i++)  

            if(inc1[i]+inc2[i]-1>ans)   

                ans=inc1[i]+inc2[i]-1;  

        printf("%d\n",n-ans);  

    }  

    return 0;  

}  

HWOJ-合唱队的更多相关文章

  1. bzoj1196:[Hnoi2010]chorus 合唱队

    这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ...

  2. BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)

    简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...

  3. 【BZOJ1996】合唱队(动态规划)

    [BZOJ1996]合唱队(动态规划) 题面 BZOJ 题解 很容易的一道题 因为每个人不是放在了左边就是放在了右边 所以每次放好的人必定是原序列的一个子串 所以,很容易想到区间\(dp\) 设\(f ...

  4. 洛谷P3205 [HNOI2011]合唱队 DP

    原题链接点这里 今天在课上听到了这个题,听完后觉得对于一道\(DP\)题目来说,好的状态定义就意味着一切啊! 来看题: 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需 ...

  5. bzoj千题计划211:bzoj1996: [Hnoi2010]chorus 合唱队

    http://www.lydsy.com/JudgeOnline/problem.php?id=1996 f[i][j][0/1] 表示已经排出队形中的[i,j],最后一个插入的人在[i,j]的i或j ...

  6. 洛谷 P3205 [HNOI2010]合唱队 解题报告

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...

  7. 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】

    1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2088  Solved: 1371[Submit][ ...

  8. 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP

    [BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...

  9. 【洛谷P3205】[HNOI2010]CHORUS 合唱队

    合唱队 区间DP f[l][r][0/1]表示生成目标序列中的区间[l,r],最后一个数是a[l]/a[r] 的方案数 边界: f[i][i][0]=1 转移: f[l][r][0]=(a[l]< ...

  10. 【BZOJ1996】【HNOI2010】合唱队 [区间DP]

    合唱队 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Sample ...

随机推荐

  1. VRChat简易教程3-往世界里导入模型和VRC接口初探

    一.准备工作 按前面的教程新建一个project,导入sdk并创建地面(Terrain)和VRCWorld. 本教程中我们学习如何导入别人做好的模型并使用VRC提供的接口来实现物品的抓取,模型素材(小 ...

  2. 编写基本的 udev 规则

    来自: https://linux.cn/article-9365-1.html?utm_source=index&utm_medium=more 读者对象 理解 udev 背后的基本概念,学 ...

  3. Mysql导出导入数据库

    1. 导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p database > database.sql 2. 导入数 ...

  4. spring security使用哈希加密的密码

    之前我们都是使用MD5 Md5PasswordEncoder 或者SHA ShaPasswordEncoder 的哈希算法进行密码加密,在spring security中依然使用只要指定使用自定义加密 ...

  5. MySQL explain 、explain extended用法

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...

  6. Ubuntu下MongoDB的安装

    一.MongoDB介绍 MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似jso ...

  7. 【LABVIEW到C#】4》String的操作之Search and Replace.vi

    C#封装如下: public class SearchAndRepalce : Darrenstring { public bool replaced; private string stringou ...

  8. guava API整理

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  9. 行内元素对齐:display:inline-block;

    行内元素对齐:display:inline-block; 今天见到一个一行元素水平排列,但是对不齐啊,如图: 代码: div{ border: 1px solid red; } .wrap > ...

  10. [6644] 02 Apr 23:11:58.976 # Creating Server TCP listening socket *:6379: bind: No such file or directory

    redis报错: [6644] 02 Apr 23:11:58.976 # Creating Server TCP listening socket *:6379: bind: No such fil ...