上原题链接:洛谷P1296
题目大意:
有n只牛,每只牛能发出的声音能让距离它 d 的牛听到
输入要求:
第一行输入两个整数 n , d
第二行输入 n 个整数 Pi 代表牛的坐标;
输出要求:
有多少对牛可以相互沟通
解题思路:
一开始我看它给的数据都是排好的就没想那么多,谁知道交上去wa
就下载了一组数据发现不仅没排序,还巨多,直接就给我干超时了
我以为直接用枚举暴力破解即可,殊不知暴力枚举超时还不稳定
优化思路后:
首先在 main 之外定义一个大的数组备用。
第一步:现将给定的 n 个坐标进行排序,这里我使用了qsort快排
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int main(void)
{
int i,j,n,d;
int count = 0;
scanf("%d %d", &n,&d);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
qsort(a,n,sizeof(a[0]),cmp);
当排序结束之后,进行枚举比较
开始时若直接完全遍历会出现超时的情况
此时只需要判断遍历的牛无法传输到枚举的牛时 break,即可提高枚举的效率
for(i = 0; i < n; i++)
{
for(j = i+1; j < n; j++){
if(a[j] >= a[i] && a[j] <= a[i]+d){
count++;
}
else break;
}
}
此时就已经求出能互相交流的牛的组数有 count 组
输出即可ac