给出一个序列(长度>=2),问去掉一个元素后是否能成为单调不降序列或单调不增序列。

对任一序列,先假设其可改造为单调不降序列,若成立则输出YES,不成立再假设其可改造为单调不增序列,若成立则输出YES,不成立则输出NO。

由于持平不影响整体单调性,为了直观,我在以下把“不降”称为“递增/升序”,把“不增”称为“递减/降序”。

递增和递减是对称的,这里先考虑递增,递减改个符号和最值就好。

我们把为维护单调性而去掉的那个点称为“坏点”。由题目的要求,“可改造”可等价于“只存在一个坏点”。

对于“坏点”的判断,我们可以先找出是否只存在一组“逆序”。

对于“almosted sorted”递增序列,只存在一组逆序无非以下四种情况(这里先不考虑逆序在边界)。

现在考虑逆序在边界的情况。由于a[]数组元素下标是1~n,而此题1<=ai<=100000,那么对于递增序列,可把a[0]设为1、把a[n+1]设为100000作为首尾哨兵节点,一定不会破坏整体单调性;递减序列做对称的处理。这样边界也可以像中间一样处理。

由于三种情况满足一种即可,而第二种可以看作第三种和第四种的交集,故只需按照第三种和第四种的情况对a[]数组各进行一次遍历,满足一种即可输出YES。

对于坏点的处理,我们采用“当它不存在”的策略,所以首次遇到坏点,忽略它,再次遇到坏点,则此种情况不成立。

至于如何由“逆序”推出“坏点”,并实现几种情况的判断,我们遍历i:0~n,对于第一对逆序a[i]>a[i+1],我们可以:

先采取“左归”(第三种),即把a[i]当作坏点,判断a[i-1]和a[i+1]是否升序(若不升序则相当于构成了第二对逆序,出现第二个坏点);

若左归不成立,再采取“右归”(第四种),即把a[i+1]当坏点,同理判断a[i]和a[i+2]是否升序。

11.23更新代码如下,更加简化,速度更快

 #include <cstdio>
using namespace std; const int MAX_N=;
const int MIN_A=;
const int MAX_A=;
int T;
int n;
int a[MAX_N];
int flag;
int fix_cnt; int main()
{
freopen("5532.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
//升序
flag=;//假设去掉最多一个元素后整体降序
fix_cnt=;
a[]=MIN_A;
a[n+]=MAX_A;
for(int i=;i<=n-;i++)
{
if(a[i]<=a[i+]) continue;
fix_cnt++;
if(fix_cnt<=&&(a[i-]<=a[i+]||a[i]<=a[i+])) continue;
flag=;
break;
}
if(flag)
{
printf("YES\n");
continue;
}
//降序
flag=;//假设去掉最多一个元素后整体降序
fix_cnt=;
a[]=MAX_A;
a[n+]=MIN_A;
for(int i=;i<=n-;i++)
{
if(a[i]>=a[i+]) continue;
fix_cnt++;
if(fix_cnt<=&&(a[i-]>=a[i+]||a[i]>=a[i+])) continue;
flag=;
break;
}
if(flag)
{
printf("YES\n");
continue;
}
printf("NO\n");
}
return ;
}

先前版本代码如下:

 #include <cstdio>
using namespace std; const int MAX_N=;
const int MIN_A=;
const int MAX_A=;
int T;
int n;
int in[MAX_N],de[MAX_N];
int flag;
int fix_cnt; int main()
{
freopen("5532.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&in[i]);
de[i]=in[i];
} //升序的情况
in[]=MIN_A;
in[n+]=MAX_A;
flag=;//假设去掉最多一个元素后整体升序
fix_cnt=;
for(int i=;i<=n-;i++)
{
if(in[i]<=in[i+]) continue;
fix_cnt++;//左归的情况
if(fix_cnt<=&&in[i-]<=in[i+]) continue;
flag=;
break;
}
if(flag)
{
printf("YES\n");
continue;
}
flag=;
fix_cnt=;
for(int i=;i<=n-;i++)
{
if(in[i]<=in[i+]) continue;
fix_cnt++;//右归的情况
if(fix_cnt<=&&in[i]<=in[i+]) continue;
flag=;
break;
}
if(flag)
{
printf("YES\n");
continue;
}
//降序的情况
de[]=MAX_A;
de[n+]=MIN_A;
flag=;//假设去掉最多一个元素后整体降序
fix_cnt=;
for(int i=;i<=n-;i++)
{
if(de[i]>=de[i+]) continue;
fix_cnt++;//左归的情况
if(fix_cnt<=&&de[i-]>=de[i+]) continue;
flag=;
break;
}
if(flag)
{
printf("YES\n");
continue;
}
flag=;
fix_cnt=;
for(int i=;i<=n-;i++)
{
if(de[i]>=de[i+]) continue;
fix_cnt++;//右归的情况
if(fix_cnt<=&&de[i]>=de[i+]) continue;
flag=;
break;
}
if(flag)
{
printf("YES\n");
continue;
}
printf("NO\n");
}
return ;
}

【HDU 5532 Almost Sorted Array】水题,模拟的更多相关文章

  1. hdu 5532 Almost Sorted Array (水题)

    Almost Sorted Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  2. hdu 5532 Almost Sorted Array(模拟)

    Problem Description We are all familiar with sorting algorithms: quick sort, merge sort, heap sort, ...

  3. HDU 5532 Almost Sorted Array (最长非递减子序列)

    题目链接 Problem Description We are all familiar with sorting algorithms: quick sort, merge sort, heap s ...

  4. HDU 5532——Almost Sorted Array——————【技巧】

    Almost Sorted Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  5. hdu 5532 Almost Sorted Array nlogn 的最长非严格单调子序列

    Almost Sorted Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  6. HDU - 5532 Almost Sorted Array (最长非严格单调子序列)

    We are all familiar with sorting algorithms: quick sort, merge sort, heap sort, insertion sort, sele ...

  7. hdu 5532 Almost Sorted Array

    http://acm.hdu.edu.cn/showproblem.php?pid=5532  题目大意: 给你一个不规则的序列,问是否能够通过删除一个元素使其成为一个有序的序列(递增或递减(其中相邻 ...

  8. CF451B Sort the Array 水题

    Codeforces Round #258 (Div. 2) Sort the Array B. Sort the Array time limit per test 1 second memory ...

  9. HDU 5538 L - House Building 水题

    L - House Building Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...

随机推荐

  1. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  2. uva 1589 by sixleaves

    坑爹的模拟题目.自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习.贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子.到网上参考别人的代码才发先这么简单的办法,自己尽然想不到. ...

  3. OpenWrt修改

    openwrt如何编译修改界面的顶部.底部信息.LOGO图片 2011-06-02 16:20:03  浏览次  以Atheros71xx为例,修改路径为:trunk/build_dir/target ...

  4. android中通过自定义xml实现你需要的shape效果 xml属性配置

    在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片,然后在写一个selector的 ...

  5. android 分享到新浪微博

    分享到新浪微博,折腾了大半个月,现在终于弄出来了,心里的那个爽呀,太痛快了,哈哈!! 废话少说,首先是认证, 1.进入新浪微博提供的开放平台注册新浪账号. 2.点击’我是开发者‘,创建一个应用,得到C ...

  6. oracle 查询表名以及表的列名

    oracle 查询表名以及表的列名的代码.   1.查询表名: 代码如下: select table_name,tablespace_name,temporary from user_tables [ ...

  7. Impala 4、Impala JDBC

    • 配置: – impala.driver=org.apache.hive.jdbc.HiveDriver – impala.url=jdbc:hive2://node2:21050/;auth=no ...

  8. 3 x 8 = 23(火了)

    颜回爱学习,德性又好,是孔子的得意门生.一天,颜回去街上办事,见一家布店前围满了人.他上前一问,才知道是买布的跟卖布的发生了纠纷. 只听买布的大嚷大叫:「三八就是二十三,你为啥要我二十四个钱?」颜回走 ...

  9. Change the ball(找规律)

    Change the ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  10. VC2010 Working Directory

    VC project setting --〉debug中的working directory指的是工作文件夹在哪里? project属性下,Debug以下的 Working Directory 是为了 ...