题目链接:http://poj.org/problem?id=1836

题目要求:

给你n个数,判断最少去掉多少个数,从中间往左是递减的序列,往右是递增的序列
需注意的是中间可能为两个相同的值,如 1 2 3 3 2 1     输出为0

题目分析:

这题和UVA10534极其相似,因为刚做完,就果断粘贴复制了,唯一的不同是这次队列不是对称的,并且如果中间有两个士兵一样高是不用去掉的,(中间,仅限两个)。

我感觉这题是水过去的,我的代码只支持有一个最大值的情况,我的做法是先判断,如果求得最大值时这个点在队列当中的位置如果在边界,则直接结束。

否则,当在最大值时看之后有没有和最大值相同的值。~~~~怎么说呢,就是水过去的。但这题n的值为1000,所以这题可以枚举。

基本操作方法:

对士兵的身高数组逐一进行枚举,枚举到的k值作为蓝色士兵,k+1值作为红色士兵,以这两个士兵分别作为最长不降子序列L1的终点和最长不升子序列L2的起点,即作为整个队列的分界点。

正确的写法:(枚举)

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
int n,sum,len,l2;
double a[],d[],w[];
int er(double q[],int l,int r,double key)//好好研究二分
{
int mid;
while(l<=r)
{
mid=(l+r)/;
if(q[mid]==key)
{
return mid;
}
else if(q[mid]>key)
{
r=mid-;
}
else l=mid+;
}
return l;
}
int er2(double q[],int l,int r,double key)//好好研究二分
{
int mid;
while(l<=r)
{
mid=(l+r)/;
if(q[mid]==key)
{
return mid;
}
else if(q[mid]>key)
{
l=mid+;
}
else r=mid-;
}
return l;
}
int main()
{
int we,wei;
while(scanf("%d",&n)!=EOF)
{
for(int i=; i<=n; i++)
{
scanf("%lf",&a[i]);
}
sum=;
len=;
d[len]=a[];
for(int i=; i<=n; i++)
{
if(a[i]>d[len])
{
d[++len]=a[i];
l2=;
w[l2]=a[i+];
for(int j=i+; j<=n; j++)
{
if(a[j]<w[l2])
{
w[++l2]=a[j];
}
else
{
wei=er2(w,,l2,a[j]);
w[wei]=a[j];
}
}
sum=max(sum,max(l2,len));
if(i<n&&(a[i]>a[i+]||l2>))
sum=max(sum,(l2+len)); //printf("sum==%d\n",sum);
}
else
{
we=er(d,,len,a[i]);
d[we]=a[i];
if(len<=) continue;
l2=;
w[l2]=a[i+];
for(int j=i+; j<=n; j++)
{
if(a[j]<w[l2])
{
w[++l2]=a[j];
}
else
{
wei=er2(w,,l2,a[j]);
w[wei]=a[j];
}
}
sum=max(sum,max(l2,we));
if(i<n&&(a[i]>a[i+]||l2>))
sum=max(sum,(l2+we));
//printf("sum==%d\n",sum);
}
}
printf("%d\n",n-sum);
}
return ;
}

水的代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define eps 1e-9
using namespace std;
int n,ad[],ad2[],sum,len,l2;
double a[],d[],w[];
int er(double q[],int l,int r,double key)//好好研究二分
{
int mid;
while(l<=r)
{
mid=(l+r)/;
if(q[mid]==key)
{
return mid;
}
else if(q[mid]>key)
{
r=mid-;
}
else l=mid+;
}
return l;
}
int main()
{
int we;
while(scanf("%d",&n)!=EOF)
{
for(int i=; i<=n; i++)
{
scanf("%lf",&a[i]);
}
sum=;
len=;
d[len]=a[];
ad[]=;
for(int i=; i<=n; i++)
{
if(a[i]>d[len])
{
d[++len]=a[i];
ad[i]=len;
}
else
{
we=er(d,,len,a[i]);
d[we]=a[i];
ad[i]=we;
}
}
l2=;
w[l2]=a[n];
ad2[n]=;
for(int i=n-; i>=; i--)
{
if(a[i]>w[l2])
{
w[++l2]=a[i];
ad2[i]=l2;
}
else
{
we=er(w,,l2,a[i]);
w[we]=a[i];
ad2[i]=we;
}
}
int key=;
for(int i=;i<=n;i++)
{
if(sum<(ad[i]+ad2[i]-))
{
sum=ad[i]+ad2[i]-;
key=i;
}
}
if(ad[key]==||ad2[key]==)
{
printf("%d\n",n-sum);
continue;
}
int F=;
if(ad[key]==ad2[key])
{
for(int i=n;i>key;i--)
{
if(a[i]==a[key])
{
F=;
printf("%d\n",n-sum-);
break;
}
}
}
if(F==)
continue;
if(a[key-]==a[key]||a[key]==a[key+])
{
printf("%d\n",n-sum-);
}
else printf("%d\n",n-sum);
}
return ;
}

POJ1836:Alignment(LIS的应用)的更多相关文章

  1. POJ1836 Alignment(LIS)

    题目链接. 分析: 从左向右求一遍LIS,再从右向左求一遍LIS,最后一综合,就OK了. 注意: 有一种特殊情况(详见discuss): 8 3 4 5 1 2 5 4 3 答案是:2 AC代码如下: ...

  2. POJ1836 - Alignment(LIS)

    题目大意 一队士兵排成一条直线,问最少出队几个士兵,使得队里的每个士兵都可以看到又端点或者左端点 题解 从左往右搞一遍LIS,然后从右往左搞一遍LIS,然后枚举即可... 代码: #include&l ...

  3. poj1836 Alignment

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11707   Accepted: 3730 Descri ...

  4. POJ 1836 Alignment --LIS&LDS

    题意:n个士兵站成一排,求去掉最少的人数,使剩下的这排士兵的身高形成“峰形”分布,即求前面部分的LIS加上后面部分的LDS的最大值. 做法:分别求出LIS和LDS,枚举中点,求LIS+LDS的最大值. ...

  5. POJ 1836 Alignment 最长递增子序列(LIS)的变形

    大致题意:给出一队士兵的身高,一开始不是按身高排序的.要求最少的人出列,使原序列的士兵的身高先递增后递减. 求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多. 1 2 3 4 ...

  6. POJ 1836 Alignment

    Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11450 Accepted: 3647 Descriptio ...

  7. UVa10534 - Wavio Sequence(LIS)

    题目大意 给定一个长度为n的整数序列,求个最长子序列(不一定连续),使得该序列的长度为奇数2k+1,前k+1个数严格递增,后k+1个数严格递减.注意,严格递增意味着该序列中的两个相邻数不能相同.n&l ...

  8. POJ - 1836 Alignment (动态规划)

    https://vjudge.net/problem/POJ-1836 题意 求最少删除的数,使序列中任意一个位置的数的某一边都是递减的. 分析 任意一个位置的数的某一边都是递减的,就是说对于数h[i ...

  9. POJ 1836-Alignment(DP/LIS变形)

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13465   Accepted: 4336 Descri ...

随机推荐

  1. HeadFirst jsp 08 无脚本JSP

    web页面设计人员真的必须懂 java ? web页面人员可以很快学习 EL 语言. 目前不知道 EL 应用前景如何, 但是我们香港系统没有使用 EL. include 指令 include指令告诉容 ...

  2. [Java] 一种好的JAVA分页实现

    喃都不说了,贴代码,意思都在代码里面了 Page.java //分页类.定义分页字段信息,供前台页面使用 package com.core.common; import java.util.List; ...

  3. 云通讯 为php_sdk 添加关闭子账户扩展

  4. selenium使用中遇到的问题

    1.Exception in thread "main" org.openqa.selenium.WebDriverException: Cannot find firefox b ...

  5. oracle起定时任务,每隔1秒执行一次

    创建一个测试表和一个存储过程: create table a(a date); create or replace procedure test as begin insert into a valu ...

  6. 一个线程可以拿到多个锁标记,一个对象最多只能将monitor给一个线程

    当用Synchronized修饰某个方法的时候,表示该方法都对当前对象加锁. 给方法加Synchronized和用Synchronized修饰对象的效果是一致的. 一个线程可以拿到多个锁标记,一个对象 ...

  7. Python3创建RIDE桌面快捷方式的另一种方法

    今天尝试了一下Python3下安装Robot Framework,但是原来的Python2下创建ride快捷方式的方法都不奏效,启动不了ride.于是,转为VBS脚本的方式来间接创建快捷方式.毕竟,每 ...

  8. AngularJS------各种版本下载地址

    转载: http://blog.csdn.net/Rongbo_J/article/details/51325606 下载地址: github https://github.com/angular/a ...

  9. cookie是什么,在什么地方会用到

    1.它是由服务器存储在硬盘上一的上小型txt文件 2..cookie也可以理解为缓存,方便下次浏览,推介等作用

  10. Android无线测试之—UiAutomator UiScrollable API介绍五

    滑动区域校准常量设置与获取 一.校准概念 校准常量指的是:滑动操作坐标时的偏移量,用来取偏移比例 二.相关API 返回值 API 描述 double getSwipeDeadZonePercentag ...