题目描述
FJ 最近在网上发现干草买一送一的一笔交易,他每买一捆尺寸为A的干草,就可以免费获赠一捆尺寸为 B的干草,B注意 一定小于 A.然而,这个买卖是有限制的:需要花钱的干草都是高质量的,而免费赠送的都是次品。给出 n捆高质量的干草尺寸,以及 m捆次品干草尺寸,找出 FJ 最多可以买到多少捆干草。他可以单独买高质量的干草而没有获赠免费的次品干草;但是他不能单独买次品干草。
输入格式
第 1行:两个用空格隔开的整数 n和 m。
第2行到第 n+1行:每行一个整数,表示一捆高质量干草的尺寸。
第 N+2行到第 n+m+1行:每行一个整数,表示一捆次品干草的尺寸。
输出格式
唯一一行:一个整数,表示 FJ 可以买到干草的最大捆数。
样例
样例输入
3 4
6
1
3
1
5
3
4
样例输出
5
数据范围与提示
1<n<100,000
1<m<100,000
1<尺寸<1,000,000
#include <iostream>
#include <algorithm>
#include <cstring>
#define debug 0
#define maxN 100000
using namespace std;
int main() {
#if debug != 1
freopen("B.in", "r", stdin);
freopen("B.out", "w", stdout);
#endif
long n, m, p, sum;
long num1[maxN], num2[maxN];
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> num1[i];
for (int i = 0; i < m; i++) cin >> num2[i];
sort(num1, num1 + n, [](long x, long y) { return x > y; });
sort(num2, num2 + m, [](long x, long y) { return x > y; });
sum = p = 0;
for (int i = 0; i < n; i++) {
sum++;
while (p < m && num2[p] >= num1[i]) p++;
if (p < m && num2[p] < num1[i])
sum++;
p++;
}
cout << sum;
#if debug != 1
fclose(stdin);
fclose(stdout);
#endif
return 0;
}