鱼C论坛

 找回密码
 立即注册
查看: 1893|回复: 3

[已解决]C语言 最近对问题

[复制链接]
发表于 2021-10-31 01:11:03 | 显示全部楼层 |阅读模式
10鱼币
下面是题目和测试用例
需求.png
测试用例.png
以下是我的代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>

  5. #define INF 2147483647
  6. #define N 1000000

  7. struct node{
  8.         int x;
  9.         int y;
  10. }point[N];

  11. int cmp(const void *a,const void *b)
  12. {
  13.         struct node ac = *(struct node*)a;
  14.         struct node bd = *(struct node*)b;
  15.         if (ac.x != bd.x)
  16.                 return ac.x - bd.x;
  17.         else return ac.y - bd.y;
  18. }//结构体排序


  19. int mindistance(int left,int right){
  20.         return left<right?left:right;//返回大小关系
  21. }

  22. int distance(int left,int right){
  23.         return ((point[left].x - point[right].x)*(point[left].x - point[right].x) + (point[left].y - point[right].y)*(point[left].y - point[right].y));
  24. }//计算距离的平方

  25. int Closest_Pair(int left,int right){
  26.         int End_dis = INF;
  27.         int i=0,j=0,k=0;
  28.        
  29.         if (left == right) return End_dis;//假如区间里面只有一个点,那么返回无穷大
  30.         if (right - left == 1) return distance(left,right);//假如区间里面只有两个点,那么直接返回这两点之间距离的平方
  31.          
  32.        
  33.         int mid = (left + right)/2;//计算中线,判断是否是大于等于三个点的情况
  34.        
  35.         int distanceleft  = Closest_Pair(left,mid);//左边递归
  36.         int distanceright = Closest_Pair(mid+1,right);//右边递归
  37.        
  38.         End_dis = mindistance(distanceleft,distanceright) ;//比较左右两边距离的平方,找出最小值,即为d
  39.        
  40.         int temp[N] = {0}; //储存宽度为d的点
  41.        
  42.         for (i = left; i < right; i++){//找出符合要求的距离mid横坐标的平方小于d的点
  43.                 if ( (point[left].x - point[right].x)*(point[left].x - point[right].x) <= End_dis ){
  44.                         temp[k++] = i;//temp用来暂时存储符合要求的点的序号
  45.                 }
  46.         }
  47.         for (i=0; i<k; i++){
  48.                 for(j=i+1; j<k&&j<i+7; j++){
  49.                         if ((point[temp[i]].y - point[temp[j]].y)*(point[temp[i]].y - point[temp[j]].y) <End_dis)
  50.                                 End_dis = mindistance(End_dis,distance(temp[i],temp[j]));
  51.                 }
  52.         }
  53.         return End_dis;       
  54. }

  55. int main(){
  56.         int n,i;
  57.         scanf("%d",&n);
  58.         for(i=0;i<n;i++){
  59.                 scanf ("%d %d",&point[i].x,&point[i].y);
  60.         }
  61.         qsort(point,n,sizeof(point[0]),cmp);
  62.         printf("%d\n",Closest_Pair(0,n-1));
  63.         return 0;
  64. }
复制代码

这个代码第一个测试用例就过不去,我想请问一下问题出在哪里
同时,假如我把数组开到10^6,不管我输入什么,都会出现下图问题
1.png
想请教一下大家问题出在哪里,谢谢!
最佳答案
2021-10-31 01:11:04

静态数组定义的太大了。
  1. int Closest_Pair(int left,int right){
  2.         int End_dis = INF;
  3.         int i=0,j=0,k=0;
  4.         
  5.         if (left == right) return End_dis;//假如区间里面只有一个点,那么返回无穷大
  6.         if (right - left == 1) return distance(left,right);//假如区间里面只有两个点,那么直接返回这两点之间距离的平方
  7.          
  8.         
  9.         int mid = (left + right)/2;//计算中线,判断是否是大于等于三个点的情况
  10.         
  11.         int distanceleft  = Closest_Pair(left,mid);//左边递归
  12.         int distanceright = Closest_Pair(mid+1,right);//右边递归
  13.         
  14.         End_dis = mindistance(distanceleft,distanceright) ;//比较左右两边距离的平方,找出最小值,即为d
  15.         //////////
  16.         int *temp = new int[N]; //储存宽度为d的点
  17.         //////////
  18.         for (i = left; i < right; i++){//找出符合要求的距离mid横坐标的平方小于d的点
  19.                 if ( (point[left].x - point[right].x)*(point[left].x - point[right].x) <= End_dis ){
  20.                         temp[k++] = i;//temp用来暂时存储符合要求的点的序号
  21.                 }
  22.         }
  23.         for (i=0; i<k; i++){
  24.                 for(j=i+1; j<k&&j<i+7; j++){
  25.                         if ((point[temp[i]].y - point[temp[j]].y)*(point[temp[i]].y - point[temp[j]].y) <End_dis)
  26.                                 End_dis = mindistance(End_dis,distance(temp[i],temp[j]));
  27.                 }
  28.         }
  29.                 delete[] temp;////////////
  30.         return End_dis;        
  31. }
复制代码

最佳答案

查看完整内容

静态数组定义的太大了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-31 01:11:04 | 显示全部楼层    本楼为最佳答案   

静态数组定义的太大了。
  1. int Closest_Pair(int left,int right){
  2.         int End_dis = INF;
  3.         int i=0,j=0,k=0;
  4.         
  5.         if (left == right) return End_dis;//假如区间里面只有一个点,那么返回无穷大
  6.         if (right - left == 1) return distance(left,right);//假如区间里面只有两个点,那么直接返回这两点之间距离的平方
  7.          
  8.         
  9.         int mid = (left + right)/2;//计算中线,判断是否是大于等于三个点的情况
  10.         
  11.         int distanceleft  = Closest_Pair(left,mid);//左边递归
  12.         int distanceright = Closest_Pair(mid+1,right);//右边递归
  13.         
  14.         End_dis = mindistance(distanceleft,distanceright) ;//比较左右两边距离的平方,找出最小值,即为d
  15.         //////////
  16.         int *temp = new int[N]; //储存宽度为d的点
  17.         //////////
  18.         for (i = left; i < right; i++){//找出符合要求的距离mid横坐标的平方小于d的点
  19.                 if ( (point[left].x - point[right].x)*(point[left].x - point[right].x) <= End_dis ){
  20.                         temp[k++] = i;//temp用来暂时存储符合要求的点的序号
  21.                 }
  22.         }
  23.         for (i=0; i<k; i++){
  24.                 for(j=i+1; j<k&&j<i+7; j++){
  25.                         if ((point[temp[i]].y - point[temp[j]].y)*(point[temp[i]].y - point[temp[j]].y) <End_dis)
  26.                                 End_dis = mindistance(End_dis,distance(temp[i],temp[j]));
  27.                 }
  28.         }
  29.                 delete[] temp;////////////
  30.         return End_dis;        
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-31 08:12:14 | 显示全部楼层
n 不超过 1000000
x、y不超过 10000
以你的代码时间复杂度,不超时(TLE)吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-31 19:40:13 | 显示全部楼层
jhq999 发表于 2021-10-31 01:11
静态数组定义的太大了。

谢谢!这段改完之后还是有一个超时,然后我把数组开到全局变量里头就过了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 18:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表