问题描述 有一天,一种病毒正在以每秒 v 米的速度于原点开始蔓延,此时有 n 个人位于距原点 xi 米的位置,每人以每秒 yi 米的速度开始逃散,问 10100000 秒后有多少人会被感染? 输入描述 输入的第一行包含两个整数 n, v 代表人数和病毒扩散速度。 接下来 n 行每行输入两个正整数 xi, yi 代表第i 个人距原点 xi 米的位置,每人以每秒 yi 米的速度开始逃散。 输出描述 输出最后会被感染的人数。 样例输入 5 10 3 5 2 8 3 10 5 9 4 11 样例输出 3 提示 1 <= n <= 10^6 1 <= v, xi, yi <= 10^3直接给代码C语言
时间: 2023-12-29 22:05:23 浏览: 28
好的,下面是 C 语言代码实现:
```c
#include <stdio.h>
#include <math.h>
int main() {
int n, v;
scanf("%d %d", &n, &v);
int count = 0;
for (int i = 0; i < n; i++) {
int x, y;
scanf("%d %d", &x, &y);
// 计算直线和圆的交点
int a = y, b = -1, c = x;
int delta = b * b - 4 * a * c;
if (delta < 0) continue; // 直线和圆没有交点
double t1 = (-b + sqrt(delta)) / (2.0 * a);
double t2 = (-b - sqrt(delta)) / (2.0 * a);
double t = fmax(t1, t2);
// 判断交点是否在圆内部
if (v * t >= sqrt(x * x + y * y)) {
count++;
}
}
printf("%d\n", count);
return 0;
}
```
注意,由于计算直线和圆的交点可能存在虚数解,因此需要判断 delta 是否小于 0。另外,计算交点时需要取较大的那个解,因为只有较大的解才对应着最后被感染的时刻。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)