题解:AT_abc431_c [ABC431C] Robot Factory
题目大意
有
如果能够形成至少 Yes,否则输出 No。
解题思路
- 将
A 序列排序和B 序列排序后,可以用两个指针标记它。 - 一个标记
A 序列(l 指针),一个标记B 序列(r 指针)。 -
- 当满足要求,指针
l 和r 往右跳一格。 - 不然,就是身体部件重量不够,
r 往右跳一格。
优化思路
- 不妨看到,无论够不够格,
r 都会往右跳一格。 - 所以,只需要把指针
r 变成一个循环就可以了。
代码实现
方法一:标准双指针
#include <bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
void solve();
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) solve();
return 0;
}
void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n), b(m);
for (auto &t : a) cin >> t; //遍历 a 数组以便输入
for (auto &t : b) cin >> t; //遍历 b 数组以便输入
sort(a.begin(), a.end());
sort(b.begin(), b.end());
int l = 0, r = 0, cnt = 0;
while (l < n && r < m) {
if (a[l] <= b[r]) {
cnt++;
l++;
r++;
} else r++;
}
if (cnt >= k) cout << "Yes\n";
else cout << "No\n";
return ;
}
方法二:优化版本
此代码是 Nathan 老师的代码再次优化而来。
#include <bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
void solve();
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) solve();
return 0;
}
void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n), b(m);
for (auto &t : a) cin >> t; //遍历 a 数组以便输入
for (auto &t : b) cin << t; //遍历 b 数组以便输入
sort(a.begin(), a.end());
sort(b.begin(), b.end());
int l = 0, cnt = 0;
for (int i = 0; i < m; i++) {
if (a[l] <= b[i]) {
l++;
cnt++;
}
}
if (cnt >= k) cout << "Yes\n";
else cout << "No\n";
return ;
}