用C语言编写在你的养牛场,所有的奶牛都养在一排呈直线的牛栏中。一共有n头奶牛,其中第i头牛在直线上所处的位置可以用一个整数坐标来表示。在无聊的日子里,奶牛们常常在自己的牛栏里与其它奶牛交流一些八卦新闻。每头奶牛发出的声音响度是一样的,而由于声波的能量衰减,某头奶牛发出的声音只能被与它距离不超过d的奶牛所听到,这样这对奶牛就称为可以相互交流的。现在给出所有奶牛的位置和声音所能传播的最远距离d,请你编个程序来计算你的养牛场里究竟有多少对可以相互交流的奶牛。 输入要求 第1行包含一个整数N,代表测试组数。 接下来的2N行中,奇数行包含两个整数n(奶牛数)和d(声音所能传播的最远距离); 偶数行包含n个整数,每个整数都是一个坐标pi,描述一头奶牛在直线上的坐标。 输出要求 一共N行,每行一个数,表示该组测试中养牛场中可以相互交流奶牛的对数。
时间: 2024-03-08 14:48:26 浏览: 81
以下是用C语言编写的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
int m, d;
scanf("%d%d", &m, &d);
int pos[MAXN];
for (int i = 0; i < m; i++) {
scanf("%d", &pos[i]);
}
qsort(pos, m, sizeof(int), cmp); // 排序
int cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = i + 1; j < m; j++) {
if (pos[j] - pos[i] <= d) {
cnt++; // 统计可以相互交流的奶牛对
} else {
break; // 剪枝
}
}
}
printf("%d\n", cnt);
}
return 0;
}
```
思路:对于每组测试数据,先将奶牛的位置进行排序,然后遍历每对奶牛,统计可以相互交流的奶牛对数。为了优化时间复杂度,可以加入剪枝,即当第j头奶牛与第i头奶牛的距离大于d时,跳出内层循环,因为后面的奶牛距离第i头奶牛的距离也必然大于d。
阅读全文