胡子修剪 - hydro

idea

题目传送门
简要题意:给你n个数字,你可以对相邻插值为1的元素进行操作(从最左侧开始操作),删去较大的数字。问最多需要多少次才能使相邻元素的插值不为1

solve

既然题目给定了是从最左侧开始操作,那么根据数字读入的顺序进行模拟即可。

遇到两个差值为1的,就把较短的放在上方,较长的删去。

碰到两个差值不为1的,把后来的放到上方。然后继续进行操作。

image

(如图)

思路理清楚了,就是选择操作时使用的容器,vector和stack都可以满足这个需求(先进后出,可以访问顶部元素)

更加详细的地方代码内有标注

Code

vector和stack的实现方法几乎一样,只是操作的函数从push_back() 变成push()一类的,下面提供了赛时AC的vector的写法。

vector实现

void solve()
{
    int n;
    cin >> n;
    vector<int> val(n);
    for (auto &i : val)//语法糖,等价于for(int i = 0; i < n;i++)
        cin >> i;
    vector<int> deal;//使用vector来模拟这个过程
    deal.push_back(val[0]);//首先先放入第一个元素
    ll cnt = 0;//用来记录操作的次数
    for (int i = 1; i < n; i++)
    {
        if (deal.size() && deal.back() - val[i] == 1)//当vector内部存储着元素时,且vector尾部(顶部)的元素比后面的元素大
        {
            deal.pop_back();//删除尾部的元素
            cnt++;//计数
        }
        if (deal.size() && val[i] - deal.back() == 1)////当vector内部存储着元素时,且后面的元素比尾部元素大的时候,相当于直接删除了后面的元素,直接给cnt++就行
            cnt++;
        else
            deal.push_back(val[i]);//其余情况就是两数相等、差值大于1、vector内部没有元素这些情况
    }
    cout << cnt;//输出答案即可

    return;
}
posted @ 2024-01-28 19:23  应许方舟  阅读(13)  评论(0)    收藏  举报