胡子修剪 - hydro
idea
题目传送门
简要题意:给你n个数字,你可以对相邻插值为1的元素进行操作(从最左侧开始操作),删去较大的数字。问最多需要多少次才能使相邻元素的插值不为1
solve
既然题目给定了是从最左侧开始操作,那么根据数字读入的顺序进行模拟即可。
遇到两个差值为1的,就把较短的放在上方,较长的删去。
碰到两个差值不为1的,把后来的放到上方。然后继续进行操作。

(如图)
思路理清楚了,就是选择操作时使用的容器,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;
}
浙公网安备 33010602011771号