2015年ACMICPC亚洲区域赛长春站F题-Almost Sorted Array

题目连接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1006&cid=646

题意:给一串序列,问是否可以通过删除一个元素使其成为单调序列

思路:

1、这题给了数据范围是n<=10^5,T<=2000,所以必须O(n)的效率通过。

2、因为要删除一个数,我们就需要找到应该删除哪个数,因此就要判断删除完以后是单调不降序列还是单调不增序列。

3、因为只能删除一个数,所以只有一个数是特殊数字(和其他数字的单调性不同),如果有多个特殊数字的话,即输出NO。


解法:所以这题在输入的过程中我们通过变量up来记录上升数字的个数,通过down来记录下降数字的个数,通过uppos来记录上升数字的位置,通过downpos来记录下降数字的位置,然后根据这四个变量分类讨论即可。

分类讨论:

up>1&&down>1

这种情况就是有多个特殊数字,即输出NO即可。


up==0||down==0||n<=3

这种情况下,全部是单调的,删除一个数字以后自然也是单调的,输出YES即可。或者删除一个数以后剩余的数不超过两个也一定是单调的。


up==1&&down==1

这种情况下,我们就要细想一下了:

第一种情况:显然我们只需要删除那个特殊的点即可,即abs(uppos-downpos)==1的时候输出YES。

那么当abs(uppos-dowpos)>1的时候一定是NO么?我们可以思考一下分下面三种情况:

Ⅰ、这样明显是NO。

Ⅱ、这样明显是YES。

Ⅲ、这样明显也是YES

所以这段代码实现应该是:

if(up==1&&down==1)
            {
                if(abs(uppos-downpos)==1)
                {
                    pfs("YES");
                    continue;
                }
                else{
                    if(uppos==1||uppos==n-1||downpos==1||downpos==n-1)
                    {
                        pfs("YES");
                        continue;
                    }
                    else
                    {
                        pfs("NO");
                        continue;
                    }
                }
            }


up==1&&down==1的情况我们讨论完了,那么剩下来的就是up>1&&down==1和up==1down>1这两种情况了。

up>1&&down==1

这种情况在删除后应该为单调不降序列

仔细思考依旧如上存在两种情况,特殊的点在中间,特殊的点在两端:

中间:这种情况下,如图如果 a[downpos+1] >= a[downpos-1] 的时候或者 a[downpos] >= a[downpos-2] 的时候输出YES,其余输出NO。

在两端:如图很容易看出来,在两端的情况必然为YES。

up>1&&down==1

这种情况再删除后应该为是单调不增序列,和第四种情况正好相反,分类讨论的情况是一样的,分在两端和在中间两种情况。

AC代码:

/*
 * test.cpp
 *
 *  Created on: 2015-11-1
 *      Author: Ivan_w
 */
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mem(a) memset(a,0,sizeof(a))
#define pfn printf("\n")
#define ll __int64
#define pfd(a) printf("%d\n",a)
#define pf2d(a,b) printf("%d %d\n",a,b)
#define pf3d(a,b,c) printf("%d %d %d\n",a,b,c)
#define pfs(a) printf("%s\n",a)
#define sfd(a) scanf("%d",&a)
#define sf2d(a,b) scanf("%d%d",&a,&b)
#define sf3d(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define sfs(a) scanf("%s",a)
#define sf    scanf
#define pf    printf
#define fr(i,n) for(int i=0;i<n;i++)
#define wang int
#define bo main 
#define byebye return 0
#define bye return
const double PI = acos(-1.0);
const double e = exp(1.0);
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
template<class T> inline T Min(T a, T b) { return a < b ? a : b; }
template<class T> inline T Max(T a, T b) { return a > b ? a : b; }
bool cmpbig(int a,int b){return a>b;}
bool cmpsmall(int a,int b){return a<b;}
using namespace std;
int a[101000];
wang bo(){
    int t;
    while(~sfd(t))
    {
        while(t--)
        {
            int n,up=0,down=0,uppos,downpos;
            sfd(n);
            for(int i=0;i<n;i++)
            {
                sfd(a[i]);
                if(i>=1)
                {
                    if(a[i]>a[i-1])
                    {
                        up++;
                        uppos=i;
                    }
                    else if(a[i]<a[i-1])
                    {
                        down++;
                        downpos=i;
                    }
                }
            }
            if(up>1&&down>1)
            {
                pfs("NO");
                continue;
            }
            else if(up==0||down==0||n<=3)
            {
                pfs("YES");
                continue;
            }
            else if(up==1&&down==1)
            {
                if(abs(uppos-downpos)==1)
                {
                    pfs("YES");
                    continue;
                }
                else{
                    if(uppos==1||uppos==n-1||downpos==1||downpos==n-1)
                    {
                        pfs("YES");
                        continue;
                    }
                    else
                    {
                        pfs("NO");
                        continue;
                    }
                }
            }
            else if(up>1&&down==1)
            {
                if(downpos==1||downpos==n-1)
                {
                    pfs("YES");
                    continue;
                }
                else{
                    if(a[downpos]>=a[downpos-2]||a[downpos+1]>=a[downpos-1])
                    {
                        pfs("YES");
                        continue;
                    }
                    else
                    {
                        pfs("NO");
                        continue;
                    }
                }
            }
            else if(up==1&&down>1)
            {
                if(uppos==1||uppos==n-1)
                {
                    pfs("YES");
                    continue;
                }
                else{
                    if(a[uppos]<=a[uppos-2]||a[uppos+1]<=a[uppos-1])
                    {
                        pfs("YES");
                        continue;
                    }
                    else
                    {
                        pfs("NO");
                        continue;
                    }
                }
            }
        }
    }
    byebye;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问(TSP)、车辆路径问(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值