Codeforces Round 1003 (Div. 4)_C1. Skibidus and Fanum Tax (easy version)#题解
C1. Skibidus and Fanum Tax (easy version)-传送门<-点我
题意如图

也就是给定两个数组,一个大小为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";
}

浙公网安备 33010602011771号