HWOJ-合唱队
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
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-合唱队的更多相关文章
- bzoj1196:[Hnoi2010]chorus 合唱队
这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ...
- BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)
简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...
- 【BZOJ1996】合唱队(动态规划)
[BZOJ1996]合唱队(动态规划) 题面 BZOJ 题解 很容易的一道题 因为每个人不是放在了左边就是放在了右边 所以每次放好的人必定是原序列的一个子串 所以,很容易想到区间\(dp\) 设\(f ...
- 洛谷P3205 [HNOI2011]合唱队 DP
原题链接点这里 今天在课上听到了这个题,听完后觉得对于一道\(DP\)题目来说,好的状态定义就意味着一切啊! 来看题: 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需 ...
- 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 ...
- 洛谷 P3205 [HNOI2010]合唱队 解题报告
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】
1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2088 Solved: 1371[Submit][ ...
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...
- 【洛谷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]< ...
- 【BZOJ1996】【HNOI2010】合唱队 [区间DP]
合唱队 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Sample ...
随机推荐
- 左连接、右连接、内连接和where
首先可以看下w3school写的关于join的介绍: http://www.w3school.com.cn/sql/sql_join.asp on是关联条件,where是筛选条件 数据库在通过连接两张 ...
- WPF MVVM模式下ComboBox级联效果 选择第一项
MVVM模式下做的省市区的级联效果.通过改变ComboBox执行命令改变市,区. 解决主要问题就是默认选中第一项 1.首先要定义一个属性,继承自INotifyPropertyChanged接口.我这里 ...
- wpf利用线程制作初始界面和关闭窗体特效
1.首先定义初始窗体,和主窗体. 初始窗体(StartWindow) 主窗体(MainWindow): 2.在主窗体界面中,加载初始窗体.注意在线程中操作UI元素需要使用BeginInvoke或者In ...
- 使用Angularjs开发Web App 视频课程 --麦子学院课程
前往搓这里: http://www.maiziedu.com/group/common/course/3271/ 查看课程搓这里:http://www.maiziedu.com/course/web/ ...
- 基于jQuery和Bootstrap的手风琴垂直菜单
在线演示 本地下载
- MySQL性能调优思路
1.MySQL性能调优思路 如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住如何来处理? 是周期性的变化还是偶尔问题?是服务器整体性能的问题, 还是某单条语句的问题? 具体到单条语句, ...
- Linux之Shell 脚本加密工具-shc
Much effort, much prosperity. 为什么要加密Shell脚本呢?当然是为了安全! 可能脚本里面涉及到密码之类的就需要进行加密了 一.下载安装shc工具 要保护自己编写的she ...
- ubuntu16.04的anacoda内置的spyder不支持中文【学习笔记】
执行下面的语句:将libfcitxplatforminputcontextplugin.so复制到anaconda2的安装目录下的platforminputcontexts目录重启生效 cp /usr ...
- JavaEE之反射
反射定义简单表述: 对于任意一个(动态的)运行中的类,我们都可以解剖它,获取类中的构造方法,成员变量,成员方法. 类的加载 (1)加载 就是指将class文件读入内存,并为之创建一个Class对象. ...
- 【bzoj5427】最长上升子序列(贪心+LIS)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5427 因为noip,博客咕了好久,这几天集中填一下坑. 这题我们可以假设往不确定的空位 ...