Avatar
“”

一个兴趣使然的追梦人

▼

Codeforces Round 1003 (Div. 4)_C1. Skibidus and Fanum Tax (easy version)#题解

C1. Skibidus and Fanum Tax (easy version)-传送门<-点我

题意如图

image

也就是给定两个数组,一个大小为n,一个大小为m,只不过在easy版本里面,m限制大小为1,让你判断经过任意次操作,数组a是否能按非递减序排序,能输出YES,否则NO

我得吐槽一下这个CF的插件的翻译功能,我一开始看错了,我以为只能操作一次,后面自己读了一下题发现人家是说每个位置只能操作一次

我的思路

我一开始因为看错题目因为只能操作一次,就写了个错代码,后面是想只要一遇到一个后面比这个当前位置小的数,我就改这个数,这样扫一遍,后面操作完之后再扫一遍判断是否非递减就可以了,当然,这个思路是错的,因为我的代码wa2了,

正确思路

对于每个位置,他都能变成原来这个数\(a\)和操作后的数记作\(b\),贪心地,我是不是最好选择a,b里面较小的,因为如果选小的数,那么对于后面的数,我可选择的数的门槛是不是变得更小了,即我可以改更,多次如果小的不满足不小于前面这个数,那么我就考虑大的,如果大的数不能满足不小于前面这个数,那肯定是不能改了,所以当然是输出NO,否则输出YES
\(ACcode\)

void solve() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m);
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int j = 0; j < m; j++) cin >> b[j];

    int bb = b[0];
    a[0] = min(a[0], bb - a[0]);

    for (int i = 1; i < n; i++) {
        int opt1 = a[i];
        int opt2 = bb - a[i];
        int mn = min(opt1, opt2);
        int mx = max(opt1, opt2);
        if (mn >= a[i - 1]) {
            a[i] = mn;
        } else if (mx >= a[i - 1]) {
            a[i] = mx;
        } else {
            cout << "NO\n";
            return;
        }
    }

    cout << "YES\n";
}
posted @ 2026-09-28 14:22  hermanO  阅读(5)  评论(0)    收藏  举报