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 a(n);
a[0] = 1;
for (int i = 1; i < n; ++i) {
cin >> a[i];
}

multiset 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';
}

posted @ 2025-08-29 14:26  _Yxc  阅读(22)  评论(0)    收藏  举报