题目描述
有 n 只怪兽向遗迹冲来。第 i 只怪兽距离遗迹 dist_i,速度 speed_i。小红每分钟只能发射一次弩箭(从第 0 分钟开始),消灭任意一只怪兽。第 i 只怪兽到达遗迹的时间为 dist_i / speed_i。如果在第 k 分钟准备射击时,存在某只未被消灭的怪兽到达时间 <= k,则防守失败。求在防守失败之前小红最多能消灭多少只怪物。
输入描述
第一行 n;第二行 n 个距离;第三行 n 个速度。
输出描述
最多消灭的怪兽数量。
示例
输入:
text
3
10 20 30
1 2 3
输出:
text
3
说明:到达时间均为 10,依次射杀即可。
解题思路
计算每只怪兽的到达时间并升序排序 。遍历数组,第 k 分钟射击时,若当前怪兽到达时间 <= k,说明来不及击杀,直接终止;否则击杀数加一。核心是最早截止时间优先的贪心策略。
C 语言代码
c
#include <stdio.h>
#include <stdlib.h>
/* 按到达时间升序比较 */
int cmp(const void *a, const void *b) {
double x = *(const double *)a, y = *(const double *)b;
return (x > y) - (x < y);
}
int main(void) {
int n;
if (scanf("%d", &n) != 1) return 0;
long long *dist = (long long *)malloc(sizeof(long long) * n);
long long *speed = (long long *)malloc(sizeof(long long) * n);
double *arrive = (double *)malloc(sizeof(double) * n);
for (int i = 0; i < n; i++) scanf("%lld", &dist[i]);
for (int i = 0; i < n; i++) scanf("%lld", &speed[i]);
for (int i = 0; i < n; i++)
arrive[i] = (double)dist[i] / (double)speed[i];
qsort(arrive, n, sizeof(double), cmp);
int killed = 0;
for (int k = 0; k < n; k++) {
/* 第 k 分钟射击,若最早到达的怪兽已到达(<=k),失败 */
if (arrive[k] <= (double)k) break;
killed++;
}
printf("%d\n", killed);
free(dist); free(speed); free(arrive);
return 0;
}