计蒜客 蓝桥杯模拟五 合并数字

蒜头君得到了 nn 个数,他想对这些数进行下面这样的操作,选出最左边的相邻的差的绝对值为 11 的两个数,只保留较小的数,删去较大的数,直到没有两个相邻的差的绝对值为 11 的数,问最多可以进行多少次这样的操作?

输入格式

输入第一行为一个整数 n(1 leq n leq 10^5)n(1n105),表示数字的总数

第二行为 nn 个整数 x_1,x_2,...,x_n(0 leq x_i leq 10^9)x1,x2,...,xn(0xi109),表示这些数。

输出格式

输出一行,为一个整数,表示蒜头君最多可以进行多少次这样的操作。

样例输入

4
1 2 0 1

样例输出

3

emmmmmm,这种到了最后才出结果的比赛真的很痛苦,考试的时候想的太简单最后结果只过了一组数据。。。
考试时的代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define maxn 100050
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
int main() {
    int n;
    while( cin >> n ) {
        int num = 0, t, a[maxn];
        cin >> t;
        for( int i = 1; i < n; i ++ ) {
            cin >> a[i];
            if( abs( t - a[i] ) == 1 ) {
                num ++;
                t = min( t, a[i] );
            } else {
                t = a[i];
            }
        }
        cout << num << endl;
    }
    return 0;
}

考完后补题的时候看别人的代码才想起来求的是最多,删去一个数字后可能会造成删去的数字前面的数和他后面的数满足相差一(啊啊啊啊啊,要是平常马上出结果的话估计会考虑到把)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define maxn 100050
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
int main() {
    int n;
    while( cin >> n ) {
        int num = 0, cnt = 0, a[maxn], b[maxn];
        for( int i = 0; i < n; i ++ ) {
            cin >> a[i];
        }
        b[0] = -9;
        for( int i = 0; i < n; i ++ ) {
            if( abs( a[i] - b[cnt] ) == 1 ) {
                num ++;
                if( b[cnt] > a[i] ) {
                    cnt --;//删去数字的时候下标后退方便判断删去后是否会形成一个差值为一
                    i --;
                }
            } else {
                cnt ++;
                b[cnt] = a[i];
            }
        }
        cout << num << endl;
    }
    return 0;
}
彼时当年少,莫负好时光。
原文地址:https://www.cnblogs.com/l609929321/p/8659654.html