专栏文章

题解:CF2060D Subtract Min Sort

CF2060D题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqea521
此快照首次捕获于
2025/12/04 03:23
3 个月前
此快照最后确认于
2025/12/04 03:23
3 个月前
查看原文

题解:CF2060D Subtract Min Sort

前言

UPD 2025.10.6: 修正了晦涩难懂的语言,避免歧义。

题意

每次选择两个相邻的数并减去其中的最小值,问能否通过若干次操作让数列单调不降

思路

赛时是猜的结论。
贪心的去想,感性理解,如果我们要使得一个序列单调不降,肯定让前面的数尽量小一点点,那么考虑对两个相邻的数进行一次操作,肯定会让两个数都变小或者不变,所以进行操作是最好的,我们只需要对于每一对数进行操作就好了。

代码实现

CPP
#include <bits/stdc++.h>

#define int long long 

using namespace std;

const int N = 2 * 1e5 + 10;

int n;
int a[N];
int t;

signed main() {
    cin >> t;
    while (t--) {
        cin >> n;
        for (int i = 1;i <= n;++i) {
            cin >> a[i];
        }
        for (int i = 2;i <= n;++i) {
            int t = min(a[i - 1],a[i]);
            a[i - 1] -= t;
            a[i] -= t;
        }
        bool flg = false;
        for (int i = 2;i <= n;++i) {
            if (a[i] < a[i - 1]) {
                cout << "NO\n";
                flg = true;
            }
            if (flg) break;
        }
        if (flg) continue;
        cout << "Yes\n";
    }
    return 0;
}

后记

一个小小的附加题。
如果我们要让这个序列单调不降呢?
留给大家自己思考,换汤不换药。

评论

1 条评论,欢迎与作者交流。

正在加载评论...