Разбор
Отсортируем по возрастанию радиусы крышек и радиусы кастрюль. Для самой маленькой кастрюли найдем наименьшую крышку, которой ее можно накрыть. Далее для второй наименьшей кастрюли найдем наименьшую ей подходящую крышку и так далее. Ответом будет количество кастрюль, которое можно покрыть крышками.
Пример
Рассмотрим какому наибольшему числу кастрюль можно подобрать крышки для заданного примера.
Реализация алгоритма
Объявим массивы, в которых будем хранить радиусы кастрюль и крышек.
#define MAX 1010 int pan[MAX], lid[MAX];
Читаем входные данные.
scanf("%d %d",&n,&m); for(i = 0; i < n; i++) scanf("%d",&pan[i]); for(i = 0; i < m; i++) scanf("%d",&lid[i]);
Сортируем радиусы кастрюль и крышек.
sort(pan,pan+n); sort(lid,lid+m);
Используя жадный метод, ищем каждый раз наименьшую крышку, которой можно накрыть наименьшую кастрюлю.
for (i = j = 0; (i < n) && (j < m); j++) if (pan[i] <= lid[j]) i++;
Выводим количество накрытых кастрюль.
printf("%d\n",i);
Java реализация
import java.util.*; public class Main { public static void main(String[] args) { Scanner con = new Scanner(System.in); int n = con.nextInt(); int m = con.nextInt(); Integer pan[] = new Integer[n]; for(int i = 0; i < n; i++) pan[i] = con.nextInt(); Integer lid[] = new Integer[n]; for(int i = 0; i < m; i++) lid[i] = con.nextInt(); Arrays.sort(pan); Arrays.sort(lid); int i = 0; for(int j = 0; (i < n) && (j < m); j++) if (pan[i] <= lid[j]) i++; System.out.println(i); con.close(); } }
Python реализация
Читаем входные данные.
n, m = map(int,input().split()) pan = list(map(int,input().split())) lid = list(map(int,input().split()))
Сортируем радиусы кастрюль и крышек.
pan.sort() lid.sort()
Используя жадный метод, ищем каждый раз наименьшую крышку, которой можно накрыть наименьшую кастрюлю.
i = j = 0 while i < n and j < m: if pan[i] <= lid[j]: i += 1 j += 1
Выводим количество накрытых кастрюль.
print(i)