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 ...
随机推荐
- stm32与arm7比较(经典)
http://wenku.baidu.com/link?url=LIVcT1AQL0IgVF1xan5Zy9rXarCBo66hj7OXSxM1ap7FpssO4c3sd1pZd8azfBPr3PBy ...
- Eclipse&STS常用小技巧
开发是经常用到的代码可进行快捷提示,比如mian alt+/就提示出了main方法是不是很方便,为什么就能提示出来呢? 马上来了: 在你使用的java开发工具中点击Window--->Prefe ...
- golang pipe
===============golang pipe============== package main import ( "fmt" "io" ) func ...
- SSO单点登录学习总结(1)——单点登录(SSO)原理解析
SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分.SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应 ...
- 多线程中的"断点"续传《notify()和wait()》
眼下在做一个项目.关于软件管理与下载的,预计项目提交日期定在6月9号.项目做了有20天了,可是在一个功能上卡住了.在这个项目中有一个功能----APK的下载须要实现. 相信大家都玩过非常多关于下载AP ...
- Core Animation 文档翻译—附录A(Layer样貌相关属性动画)
前言 在渲染过程中,核心动画获取Layer的各种属性并以特定的顺序渲染他们.这个顺序决定了Layer的最终的样貌.本节将会阐述通过设置不同的Layer样貌相关属性对应产生的渲染结果. 注意:Mac ...
- HTML基础第三讲---字体
转自:https://i.cnblogs.com/posts?categoryid=1121494 同样我们在这里继续讲一下它的body,因为它能直观的让大家观察到你所学到的成果. 这一讲,我们来学习 ...
- amazeui学习笔记--css(常用组件6)--图标Icon
amazeui学习笔记--css(常用组件6)--图标Icon 一.总结 1.关注用法即可:在 HTML 上添加添加 am-icon-{图标名称} class. <span class=&quo ...
- sql基础知识集锦
Sql常用语法 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT ...
- Javascript和jquery事件--事件对象event
1. 事件对象event 对于event,js的解释是Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.而jq的解释是事件处理(事件对象.目标元素 ...