poj 1328 贪心算法和快排(快排细节)
2015-11-09 10:33
295 查看
把海岸线看做直线,海上有小岛,岸上有雷达站
雷达站只能覆盖半径为d的区域
把地图看做直角坐标系,海岸线为X轴,陆地在下面
给定小岛坐标和雷达站的覆盖半径。
任务是建立最小的雷达站以覆盖所有的小岛
多测试
n d
n line
换行开始下个test
-1表示无解
思路:把每一个小岛当做半径为d的圆的圆心,算出圆与x轴的交点。记录左右两个坐标,进行快排后,区间重叠的个数就是雷达站个数。思路很简单,但是我在这题奉献了不少WA,原因是没弄清qsort的返回值,qsort的返回值是整形,所以在对double型数据排序的时候要注意返回值的问题,所以qosrt得cmp就得改变为:
贴上用数组实现和用结构实现的AC代码和测试数据,同时我也会更新代码集中的代码。
大神的测试数据:
测试数据,来源于poj讨论组
2 5-3 4-6 34 5-5 3-3 52 33 320 8-20 7-18 6-5 8-21 8-15 7-17 5-1 5-2 3-9 61 22 33 44 55 66 77 88 79 610 50 02 30 22 32 30 21 33 31 2-3 22 48 52 4-4 4-3 3-3 1-3 0-1 00 56 03 01 2-3 12 13 21 2-3
12 11 20 22 30 22 34 -54 34 32 36 -93 -31 2-3 22 16 21 21 21 2-3 12 10 01 20 22 30 21 33 101 102 34 53 51 102 34 54 71 102 34 50 03 91 102 34 52 50 38 30 0
运行结果:
Case 1: 1
Case 2: 2
Case 3: 4
Case 4: 1
Case 5: 1
Case 6: -1
Case 7: 3
Case 8: -1
Case 9: 2
Case 10: 1
Case 11: 1
Case 12: -1
Case 13: -1
Case 14: 2
Case 15: 1
Case 16: 1
Case 17: 1
Case 18: -1
Case 19: -1
Case 20: -1
Case 21: 1
雷达站只能覆盖半径为d的区域
把地图看做直角坐标系,海岸线为X轴,陆地在下面
给定小岛坐标和雷达站的覆盖半径。
任务是建立最小的雷达站以覆盖所有的小岛
多测试
n d
n line
换行开始下个test
-1表示无解
思路:把每一个小岛当做半径为d的圆的圆心,算出圆与x轴的交点。记录左右两个坐标,进行快排后,区间重叠的个数就是雷达站个数。思路很简单,但是我在这题奉献了不少WA,原因是没弄清qsort的返回值,qsort的返回值是整形,所以在对double型数据排序的时候要注意返回值的问题,所以qosrt得cmp就得改变为:
int cmp(const void *a,const void *b) { return ((double *)a)[0]>((double *)b)[0] ?1:-1; }也就是加了个 ?1:-1;这样就能限定返回值是整数了。这样就不会WA了
贴上用数组实现和用结构实现的AC代码和测试数据,同时我也会更新代码集中的代码。
#include<stdio.h>
#include<string.h>
#include <iostream>
#include<queue>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define maxn 1005
int cmp(const void *a,const void *b) { return ((double *)a)[0]>((double *)b)[0] ?1:-1; }
double dir[maxn][2];
int main()
{
int n,ans;
double d;
int ca=1;
while(scanf("%d %lf",&n,&d)!=EOF)
{
if(n==0&&d==0)
return 0;
int jg=0;
for(int i=0; i<n; i++)
{
double tmp1,tmp2;
scanf("%lf %lf",&tmp1,&tmp2);
if(tmp2>d)
jg=1;
double tmp3=sqrt(d*d-tmp2*tmp2);
dir[i][0]=tmp1-tmp3;
dir[i][1]=tmp1+tmp3;
}
if(!jg)
{
qsort(dir,n,sizeof(dir[0]),cmp);
/*for(int i=0;i<n;i++)
printf("%lf\n",dir[i][0]);*/
double l=dir[0][0];
double r=dir[0][1];
ans=1;
for(int i=1; i<n; i++)
{
if(dir[i][0]>r)
{
ans++;
l=dir[i][0];
r=dir[i][1];
}
else if(dir[i][1]<r)
{
l=dir[i][0];
r=dir[i][1];
}
}
}
else
ans=-1;
printf("Case %d: %d\n",ca,ans);
ca++;
}
}
#include<stdio.h> #include<string.h> #include <algorithm> #include <iostream> #include<queue> #include<math.h> #include<stdlib.h> using namespace std; #define maxn 1005 typedef struct Node{double xr;double xl;} ode; ode node[maxn]; int cmp(const void *a,const void *b) { return ((ode *)a)->xl>((ode *)b)->xl? 1:-1; } int main() { int n,ans; double d; int ca=1; while(scanf("%d %lf",&n,&d)!=EOF) { if(n==0&&d==0) return 0; int jg=0; for(int i=0; i<n; i++) { double tmp1,tmp2; scanf("%lf %lf",&tmp1,&tmp2); if(fabs(tmp2)>d) jg=1; node[i].xl=tmp1*1.0-sqrt(d*d-tmp2*tmp2); node[i].xr=tmp1*1.0+sqrt(d*d-tmp2*tmp2); } if(!jg) { qsort(node,n,sizeof(node[0]),cmp); //for(int i=0;i<n;i++) //printf("%lf\n",node[i].xl); ode tmp=node[0]; ans=1; for(int i=1; i<n; i++) { if(node[i].xl>tmp.xr) { ans++; tmp=node[i]; } else if(node[i].xr<tmp.xr) { tmp=node[i]; } } } else ans=-1; printf("Case %d: %d\n",ca,ans); ca++; } }
大神的测试数据:
测试数据,来源于poj讨论组
2 5-3 4-6 34 5-5 3-3 52 33 320 8-20 7-18 6-5 8-21 8-15 7-17 5-1 5-2 3-9 61 22 33 44 55 66 77 88 79 610 50 02 30 22 32 30 21 33 31 2-3 22 48 52 4-4 4-3 3-3 1-3 0-1 00 56 03 01 2-3 12 13 21 2-3
12 11 20 22 30 22 34 -54 34 32 36 -93 -31 2-3 22 16 21 21 21 2-3 12 10 01 20 22 30 21 33 101 102 34 53 51 102 34 54 71 102 34 50 03 91 102 34 52 50 38 30 0
运行结果:
Case 1: 1
Case 2: 2
Case 3: 4
Case 4: 1
Case 5: 1
Case 6: -1
Case 7: 3
Case 8: -1
Case 9: 2
Case 10: 1
Case 11: 1
Case 12: -1
Case 13: -1
Case 14: 2
Case 15: 1
Case 16: 1
Case 17: 1
Case 18: -1
Case 19: -1
Case 20: -1
Case 21: 1
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍
- C语言进制转换代码分享