我们可以将最低要求进行排序,对于每个最低要求,我们找到符合要求的最小值。
C++
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 5;
int a[M], b[M];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
scanf("%d", a + i);
}
for (int i = 1; i <= n; i++) {
scanf("%d", b + i);
}
sort(a + 1, a + 1 + n); // 排序为了指针能够快速找到第一个大于b[i]的数
sort(b + 1, b + 1 + n); // 优先给b[i]小的匹配a[i]
int cnt = 0, idx = 1;
for (int i = 1; i <= n; i++) {
for (; idx <= n; idx++) { // 上次比该节点小的本次也会比该节点小
if (a[idx] >= b[i]) {
cnt++, idx++;
break;
}
}
}
cout << cnt << endl;
return 0;
}
java
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n + 1];
int[] b = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = scanner.nextInt();
}
for (int i = 1; i <= n; i++) {
b[i] = scanner.nextInt();
}
Arrays.sort(a, 1, n + 1); // 排序为了指针能够快速找到第一个大于b[i]的数
Arrays.sort(b, 1, n + 1); // 优先给b[i]小的匹配a[i]
int cnt = 0;
int idx = 1;
for (int i = 1; i <= n; i++) {
for (; idx <= n; idx++) { // 上次比该节点小的本次也会比该节点小
if (a[idx] >= b[i]) {
cnt++;
idx++;
break;
}
}
}
System.out.println(cnt);
}
}
python
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
a.sort() # 排序为了指针能够快速找到第一个大于b[i]的数
b.sort() # 优先给b[i]小的匹配a[i]
cnt = 0
idx = 0
for i in range(n):
for j in range(idx, n):
if a[j] >= b[i]: # 上次比该节点小的本次也会比该节点小
idx = j + 1
cnt += 1
break
print(cnt)
小美家有很多藏品,每个价值ai元。现在小美濒临破产,他准备每天卖掉一个藏品,他每天最少花费bi元。由于小美非常奢侈,他每天会把获得的钱全部花掉。但是他又非常爱这些藏品,所以不愿意一天卖超过一个,如果没有满足今天消费的藏品可卖,那么他宁愿不卖。请问他最多可以卖掉多少藏品。
第一行输入一个整数n(1≤n≤105)。
第二行输入n个整数ai,表示藏品的价值(1≤ai≤109)。
第二行输入n个整数bi,表示每天的最低消费(1≤ai≤109)。
输出一个整数,表示最多可以卖多少个藏品。
输入
4
4 3 2 1
2 2 1 2
输出
4