【计蒜客】2018 蓝桥杯省赛 B 组模拟赛(五) ---- 程序设计:合并数字

这里写图片描述

思路: 一开始以为这个题目比较好做,就用while循环和当前第i项和当前第i+1比较就可以,
但是一旦遇到特殊情况就应付不过来了。
然后学长在群里放了题解,这种思路真的值得学习啊。
说一下思路,
分两种情况:
1. 当前第i项比第i-1项大1时,例如 1 3 4 ,第i项是4,第i-1项是3,这种情况一定是,前面i-1不存在 某一项比它相邻一项大1的情况。所以保留第i-1项,让它的nex指针从i指向i+1,第i+1项的pre指针从i指向i-1这样就保证了,消除4。
2.当前第i项比第i-1项小1是,例如 2 4 3 ,第i项是3,第i-1项是4,这种情况会出现什么情况么,消除4,保留3 后,还剩下2,3。显然这两个数也是要进行“操作” 的,所以怎样变换nex指针和pre指针才是重点。假设2 4 3 的下标分别为 0 ,1,2 应该先把pre[i]的指针指向i,即 i = pre[i];
i从2—>1 然后 nex[pre[1]] 是什么意思呢,即2的下一个应该是 3 ,所以nex[pre[i]] = nex[i]
, 那么3的上一个应该也是2 ,所以pre[nex[i]] = pre[i],这样就把4消除,3去了4的位置。

AC代码:

#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 1e5+10;
int nex[maxn];
int pre[maxn];
int x[maxn];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL),cout.tie(NULL);
    int n;
    cin>>n;
    x[0] = -2;
    x[n+1] = -2;
    for(int i=1;i<=n;i++)
        cin>>x[i];
    for(int i=0;i<=n+1;i++)
    {
        pre[i] = i-1;
        nex[i] = i+1;
    }
    int i=1;
    int ans = 0;
    while(i<=n)
    {
        if(i == 0) i = nex[i];
        if(x[i]-x[pre[i]] == 1)
        {
            nex[pre[i]] = nex[i];
            pre[nex[i]] = pre[i];
            i = pre[i];//
            ans++;
            continue;
        }
        if(x[i]-x[pre[i]] == -1)
        {
            i = pre[i];
            nex[pre[i]] = nex[i];
            pre[nex[i]] = pre[i];
            i = pre[i];
            ans++;
            continue;
        }
        i = nex[i];
    }
    cout<<ans<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值