

大致题意 : 一个长度为n的数组, 通过少于n次的操作, 使得数组非递减
操作为: 选定下标x,y,z(x < y < z), a[x] = a[y] - a[z]
分析 : 一开始看错题, 以为要用最少的操纵, 就想着贪心+区间维护, 结果wa, 看一眼题解, 测试样例, 再跑去看题才发现, 不必要用最少的操作(寄 !)
若是不必要用最少的操作就很简单了, 分析一下可以得出以下结论:
1. 若a[n] > a[n-1], 则操作一定失败, 毕竟操作数最少3个, 这种情况不能操作
2. 若a[n] >= 0, 那么我们对1~n-2的数字都进行操作 a[i] = a[n-1] - a[n], 一定可以得到一个非递减的数组
3. 若a[n] < 0, 我们无论怎么操作a[i] - a[j]其结果一定是将当前数变得比前数大的, 因为是 负 - 负, 这时只有当他已排好序时, 才能成功, 操作数0
AC代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using names

本文解析了一个关于长度为n的数组如何通过少于n次的操作使其非递减的问题,讨论了不同情况下的策略,包括数组末尾元素的正负判断,以及如何针对不同情况给出高效解决方案。
最低0.47元/天 解锁文章
285

被折叠的 条评论
为什么被折叠?



