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 ...
随机推荐
- Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?'
Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?' 一.原因 因为Python版本问题,MySQLdb ...
- elasticsearch报错[WARN ][bootstrap ] Unable to lock JVM Memory: error=12,reason=Cannot allocate memory,解决
早上在服务器上安装elasticsearch集群,在其中的一台上面安装好elasticsearch之后安装了一些插件,其中一个插件是marvel,结果可能是新版本不支持这个插件,就没有安装成功,也就索 ...
- AndroidDevTools下载
收集整理Android开发所需的Android SDK.开发中用到的工具.Android开发教程.Android设计规范,免费的设计素材等. http://www.androiddevtools.cn ...
- JSP Tomcat8.0运行连接池时发生异常【AbstractMethodError oracle.jdbc.driver.T4CConnection.isValid(I)Z】
原创 2015年12月28日 11:38:01 2004 一.Tomcat8.0运行连接池时发生异常: AbstractMethodError oracle.jdbc.driver.T4CConnec ...
- windows技巧--一次关闭所有资源管理器目录,文件夹目录
每天开机工作一段时间以后,你可能会和我一样,打开了很多的文件目录,于是一个一个的点窗口关闭.于是想有没有一次关闭所有目录的办法~~咚咚咚,经过一番寻觅,下面是我找到的办法 新建bat文件 close_ ...
- linux 挂在新硬盘
记录一下 全忘了..... PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来,才能让硬盘使用.把硬盘装好后,我们用 fdisk -l 查看下: 图中可以看出 /dev/ ...
- LeetCode Weekly Contest 23
LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...
- PAT1051. Pop Sequence (25)
#include <iostream> #include <stack> using namespace std; int sizeMax,n,k; stack<int& ...
- JAVA中的数据存储(堆及堆栈)- 转载
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可 ...
- plot 含缺失值的图
x = np.linspace(1,10,25) y = (x-4)**2 index = random.sample(range(25),5) # 从1-24中不放回随机抽取5个数 y[index ...