php实现 合唱队形(算法想清楚在动)
php实现 合唱队形(算法想清楚在动)
一、总结
一句话总结:写一个最长递增子序列的函数,正反两遍扫一下就好。写函数这样不容易错。这个好像可以用二分来优化。
1、算法题怎么提高正确率和节约时间?
算法想清楚了在做,不然会出现莫名其妙,稀奇古怪的错误。
2、php中如何填充数组?
用array_fill();
array array_fill ( int $start_index
, int $num
, mixed $value
)
$a = array_fill(5, 6, 'banana');
- Array
- (
- [5] => banana
- [6] => banana
- [7] => banana
- [8] => banana
- [9] => banana
- [10] => banana
- )
二、合唱队形
题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入描述:
整数N
输出描述:
最少需要几位同学出列
代码一:
- <?php
- //谋而后动,之前算法有问题
- while($n=trim(fgets(STDIN))){
- $numStr=trim(fgets(STDIN));
- $arr=explode(' ',$numStr);
- for($i=0;$i<$n;$i++){
- $gao[$i]=1;
- $gaoRev[$i]=1;
- }
- //print_r($arr);
- for($i=0;$i<$n;$i++){//遍历每一个人
- for($j=0;$j<$i;$j++){//遍历他们前面的
- if($arr[$i]>$arr[$j]&&$gao[$j]+1>$gao[$i]) $gao[$i]=$gao[$j]+1;
- }
- }
- for($i=$n-1;$i>0;$i--){//遍历每一个人
- for($j=$n-1;$j>$i;$j--){//遍历他们前面的
- if($arr[$i]>$arr[$j]&&$gaoRev[$j]+1>$gaoRev[$i]) $gaoRev[$i]=$gaoRev[$j]+1;
- }
- }
- for($i=0;$i<$n;$i++) $ans[$i]=$n+1-$gao[$i]-$gaoRev[$i];
- //print_r($gao);
- //print_r($gaoRev);
- echo min($ans).PHP_EOL;
- }
- ?>
代码二:
- <?php
- function lis($arr){
- $dp = array_fill(0,count($arr),1);
- $ends = array_fill(0,count($arr),0);
- $l = 0; $r = 0; $right = 0;
- $ends[0] = $arr[0];
- for($i = 1; $i<count($arr);$i++) {
- $l = 0;
- $r = $right;
- while ($l <= $r) {
- $mid = floor(($l + $r)/2);
- if($arr[$i]>$ends[$mid]) {
- $l = $mid + 1;
- }else {
- $r = $mid - 1;
- }
- }
- $right = max($right,$l);
- $dp[$i] = $l+1 ;
- $ends[$l] = $arr[$i];
- }
- return $dp;
- }
- //两遍最长递增子序列 和最大
- while (fscanf(STDIN,"%d",$N)) {
- $T = explode(" ",trim(fgets(STDIN)));
- $lis1 = lis($T);
- $lis2 = lis(array_reverse($T));
- $lis2 = array_reverse($lis2);
- for($i=0;$i<$N;$i++){
- $lis1[$i] += $lis2[$i];
- }
- $max = max($lis1);
- /* $dp1 = array_fill(0,$N,1);
- $dp2 = array_fill(0,$N,1);
- for($i=0;$i<$N;$i++){
- for($j=$i-1;$j>=0;$j--){
- if($T[$j]<$T[$i]&&$dp1[$j]+1>$dp1[$i])
- $dp1[$i] = $dp1[$j]+1;
- }
- }
- $Tr = array_reverse($T);
- for($i=0;$i<$N;$i++){
- for($j=$i-1;$j>=0;$j--){
- if($Tr[$j]<$Tr[$i]&&$dp2[$j]+1>$dp2[$i])
- $dp2[$i] = $dp2[$j]+1;
- }
- }
- $dp2 = array_reverse($dp2);
- $max = -1;
- $sum = 0;
- for($i=0;$i<$N;$i++){
- $sum = $dp1[$i]+$dp2[$i];
- if($sum>$max)
- $max = $sum;
- } */
- echo ($N-$max+1)."\n";
- }
- ?>
php实现 合唱队形(算法想清楚在动)的更多相关文章
- 洛谷 P1091 合唱队形
\[传送门在这里呀\] 题目描述 \(N\)位同学站成一排,音乐老师要请其中的\((N-K)\)位同学出列,使得剩下的\(K\)位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次 ...
- [NOIP2004] 提高组 洛谷P1091 合唱队形
题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...
- NOIP 2004 合唱队形
洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- 【题解】合唱队形——LIS坑爹的二分优化
题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...
- 合唱队形2(洛谷U5874)
题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作--手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...
- 合唱队形2 洛谷U5874
题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作——手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...
- TYVJ P1067 合唱队形 Label:上升子序列?
背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号 ...
- NOIP200407合唱队形+最长上升子序列O(n^2)详解
合唱队形解题报告 2016-05-12 4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...
随机推荐
- Elasticsearch之es学习工作中遇到的坑(陆续更新)
1:es集群脑裂问题(不要用外网ip,节点角色不要混用) 原因1:阿里云服务器,外网有时候不稳定. 解决方案:单独采购服务器,内网安装 原因2:master和node节点没有分开 解决方案: 分角色: ...
- 【AIM Tech Round 4 (Div. 2) C】Sorting by Subsequences
[链接]http://codeforces.com/contest/844/problem/C [题意] 水题,没有记录意义 [题解] 排序之后,记录每个数字原来在哪里就好. 可以形成环的. 环的个数 ...
- Android Studio运行报错,Cannot find System Java Compiler. Ensure that you have installed a JDK......
详细报错信息如下 Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Cannot find System J ...
- vue 自定义modal 模态框组件
参数名 类型 说明 visible Boolean 是否显示,默认false title String 标题 update:visible Boolean 更新visible, 使用:visible. ...
- Ubuntu14.04中踩过的坑
今天安装Ubuntu 14.0.4,因为需要使用python3,所以就直接配置如下:sudo rm /usr/bin/pythonsudo ln -s /usr/bin/python3.5 /usr ...
- ASM学习笔记--ASM 4 user guide 第一章翻译
ASM是什么? 借用别人的话 :ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能. ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机 ...
- [转]C#连接操作mysql实例
本文转自:http://hi.baidu.com/zhqngweng/item/c4d2520cb7216877bfe97edf 第三方组件:Mysql.Data.dll说明:去官方网站下载Mysql ...
- NSAttributeString创建各种文字效果
NSDictionary *attributes =@{ NSForegroundColorAttributeName: [UIColorredColor], NSFontAttributeName: ...
- 【MemSQL Start[c]UP 3.0 - Round 1 E】Desk Disorder
[链接]h在这里写链接 [题意] 有N个人. 2N个座位. 现在告诉你这N个人它们现在的座位.以及它们想去的座位. 每个人可以去它们想去的座位或者就站在原地不动. 新的座位和旧的座位,都不允许一个座位 ...
- JavaFX2 - 文本可复制的Label
背景介绍 我的公司和我个人一直都使用JavaFX2来编写client应用程序,同一时候也作为Applet在浏览器中执行. 我们的客户以前拿我们的产品和网页对照,然后向我们提过两个需求: (1) 希望界 ...