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 ...
随机推荐
- jquery 04
$('div').slice(1,3).css('background','red').end().css('color','blue'); 入栈原理图: <!DOCTYPE HTML> ...
- js16--自定义原型对象
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 【编程】概念的理解 —— socket
socket:A socket is something into which something is plugged or fitted (also called a receptacle). A ...
- sql之group by的用法
1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...
- [Javascript] Different ways to create an new array/object based on existing array/object
Array: 1. slice() const newAry = ary.slice() 2. concat const newAry = [].concat(ary) 3. spread oprea ...
- ubuntu14中 memcached安装与使用
第一步,先安装lib-event 下载lib-event 的包http://libevent.org/ 下载完之后,解压安装 ./configure –prefix=/usr (或 ./config ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- POJ Oulipo(KMP模板题)
题意:找出模板在文本串中出现的次数 思路:KMP模板题 #include<cstdio> #include<cstring> #include<cmath> #in ...
- win7桌面有个无法删除的IE图标
平台:win7 症状:安装软件时没仔细看,结果装上了一大堆,挨个卸载后桌面残留了一个IE无法删除.在该图标上点右键只有“打开”“属性”“创建快捷方式”三个选项,主页默认为www.2345.com. 解 ...
- ECMall 25个 数据库表 说明文档
ecm_acategory //文章分类表 字段 类型 Null 默认 注释 cate_id int(10) 否 自增ID号,分类ID号 cate_name varchar(100) 否 分类 ...