G1. Dances (Easy version)
题意:给定长度为n的数组a和b,并且给定一个数字m,有m个数组c,数字c从a复制而来,并且只有C[1]跟a不同,其他全都一样。c[1]表示当前是m中第几个数组。现在要对每个c和b进行操作,问至少操作多少次,可以让每个位置上c[i]<b[i],求出所有的c的答案并进行累加。
思路:简单版本,m = 1,一次遍历a查找b中能满足条件的第一个数即可。
总结:如果是复杂版本,就是先固定2n,求出答案累加,然后再考虑剩下的数字中1m最大能满足到多少,再累加答案即可。
有个坑点,如果是红黑树容器,一定要用自己的lower_bound,类内函数,不要用标准库的std::upper_bound,时间复杂度会退化到O(n)
inline void solve() {
int n, m;
cin >> n >> m;
vector<int> a(n);
a[0] = 1;
for (int i = 1; i < n; ++i) {
cin >> a[i];
}
multiset<int> b;
for (int i = 0; i < n; ++i) {
int t;
cin >> t;
b.insert(t);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
auto it = b.upper_bound(a[i]);
if (it == b.end()) {
ans ++;
}
else {
b.erase(it);
}
}
cout << ans << '\n';
}

浙公网安备 33010602011771号