https://ac.nowcoder.com/acm/contest/9934/H
题解说是用贪心,然后我没用?
AK和爆0算范围都是一样的,总人数-做对的人数=做错的人数。
首先算最大值,这个比较简单,就是数组中的最小值。
然后再算最小值,这个可以想成不同种的天气,例如1-3下雨,2-4下雪,只有重合的2-3才会既下雪又下雨,也就是说2-3才是有用的部分,其他的部分你再来任何天气也实现不了全下(全不下)。所以方法就是对数组遍历一遍,从第二个开始,如果和小于总人数,就说明放得下(可以做到不重叠),大于总人数的话我们就只留下重合的部分,其余的丢掉,也就是和-总人数,然后继续…
感觉这样做还挺神奇的?
#include <bits/stdc++.h>
using namespace std;
long long a[10001], b[100001];
const int N = 1e9 + 1;
int main() {
int t;
int n, m;
cin >> t;
while (t--) {
long long l1 = 0, r1 = N;
long long l2 = 0, r2 = N;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = m - a[i];
l1 += a[i];
l2 += b[i];
r1 = min(r1, a[i]);
r2 = min(r2, b[i]);
if (i > 1) {
if (l1 <= m)
l1 = 0;
else
l1 -= m;
if (l2 <= m)
l2 = 0;
else
l2 -= m;
}
}
cout << l1 << ' ' << r1 << endl;
cout << l2 << ' ' << r2 << endl;
}
return 0;
}