poj1328解题报告(贪心、线段交集)

POJ 1328,题目链接http://poj.org/problem?id=1328

题意:

有一海岸线(x轴),一半是陆地(y<0)、一半是海(y>0),海上有一些小岛(用坐标点表示P1、P2...),现要在海岸线上建雷达(覆盖半径R)。给出所有小岛的位置,和雷达半径,求最少需要多少个雷达?

思路:


1. 知道小岛位置,和雷达半径,那么以小岛为圆心,雷达覆盖半径为半径画圆,可以求出小岛与x轴有0(雷达无法覆盖)、1(雷达只能在这个点上才能覆盖)、2个交点(雷达在两点之间都能覆盖该小岛)

2. 要求最少雷达多少个,即把雷达放在1中线段的交集内。

那么这就变成了线段交集问题。(贪心)

代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

//404k 79ms

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <algorithm>

typedef
struct tagLINE{

    double
left;

    double
right;

}Line;

void
sortLineBuf(Line *p, int
num)

{

    Line temp;

    for
(int i=0; i<num; ++i)

    {

        for
(int j=i+1; j<num; ++j)

        {

            if
(p[j].left < p[i].left){

                temp = p[i];

                p[i] = p[j];

                p[j] = temp;

            }

        }

    }

}

int
main()

{

    int
caseNum = 0;

    double
tempPoint;

    Line tempLine;

    while
(true)

    {

        int
islandNum = 0, r = 0;

        scanf("%d%d", &islandNum, &r);

        if
(islandNum == 0 && r == 0) break;

        double
*p = (double*)malloc(sizeof(double) * islandNum * 2);

        double
*pX = p;

        double
*pY = p+islandNum;

        for(int
i=0; i<islandNum; ++i){

            scanf("%lf%lf", &pX[i], &pY[i]);

        }

        //

        int
rapar = 0;

        bool
bImpossible = true;

        Line* pLine = (Line*)malloc(sizeof(Line) * islandNum);

        //1 转换为直线

        for(int
i=0; i<islandNum; ++i){

            if
(fabs(pY[i]) > r){

                bImpossible = false;

                rapar = -1;

                break;

            }

            tempPoint = sqrt(r*r - pY[i]*pY[i]);

            pLine[i].left = pX[i]-tempPoint;

            pLine[i].right = pX[i]+tempPoint;

        }

        if
(bImpossible)

        {

            rapar = 1;

            //2

            sortLineBuf(pLine, islandNum);

            //3 求解线段交集

            tempLine = pLine[0];

            for
(int i=1; i<islandNum; ++i) 

            

                if
(pLine[i].left > tempLine.right) 

                

                    ++rapar;

                    tempLine = pLine[i];

                

                else
if (pLine[i].right < tempLine.right) 

                

                    tempLine = pLine[i]; 

                

            }

        }

        printf("Case %d: %d\n", ++caseNum, rapar);

        free(p);

        free(pLine);

    }

    return
0;

}

poj1328解题报告(贪心、线段交集)

时间: 2024-11-10 11:31:40

poj1328解题报告(贪心、线段交集)的相关文章

【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】

目录: 1.A[树相关]    2.B[找规律]    3.C[贪心][拓扑排序] A. 描述(A 输入文件 : A.input 输出文件 : A.output)一个城市的构成是一颗n 个节点的树(2 ≤ n ≤ 200), 现在需要在树中找出两条不相交的路径(即两条路径不能有重边也不能有重点),使得路径的长度的乘积最大.输入描述第一行一个数n 表示这个城市一共有 n 个节点.接下来 n-1 行,每行两个数ai 和bi (1 ≤ ai,bi ≤ n ),分别表示从ai 到bi,有一条边,每条边的

ACM: Just a Hook 解题报告 -线段树

E - Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive met

【未完成0.0】Noip2012提高组day2 解题报告

第一次写一套题的解题报告,感觉会比较长.(更新中Loading....):) 题目: 第一题:同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一行,包含两个正整数a, b,用一个空格隔开. 输出格式 输出只有一行,包含一个正整数x0,即最小正整数解.输入数据保证一定有解. 样例1 样例输入1 3 10 样例输出1 7 限制 每个测试点1s 提示 对于40%的数据,2 ≤b≤ 1,000: 对于60%的数据,2 ≤b≤ 50,000,000:

济南-1029试题解题报告

By shenben 本解题报告解析均为100分解题思路. 上午 T1 题意:给你两个日期,问这两个日期差了多少毫秒 解析:标程用ctime库函数写的,编译器版本高了才会过(NOIP编译器版本不会太高): 只能老老实实打模拟. 小技巧:最后多输出“000”,计算秒就好了.(特判两个时间相同,只输出“0”) T2 题意:有m个站口,有n个人按顺序排队,求n+1个人最少等多长时间 解析:(标程显然 同下) ①n<m 输出0(显然) ②n>=m 建一个小根堆(可以用优先队列),把前m个人的时间扔到堆

poj分类解题报告索引

图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Journey poj1724 - ROADS(邻接表+DFS) BFS poj3278 - Catch That Cow(空间BFS) poj2251 - Dungeon Master(空间BFS) poj3414 - Pots poj1915 - Knight Moves poj3126 - Prim

Codeforces Round #262 (Div. 2)解题报告

详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2 1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A 有n双袜子,每天穿一双然后扔掉,每隔m天买一双新袜子,问最多少天后没有袜子穿.. 简单思维题:以前不注重这方面的训练,结果做了比较久,这种题自己边模拟边想.不过要多考虑trick ```c++ int main(){ i

Codeforces Round #616 (Div. 2)解题报告

Codeforces Round #616 (Div. 2)解题报告 A. Even But Not Even 找两个奇数就行了. #include<bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; string ans = ""; for(int i = 0; i < n; i++) { if(int(s[i] - '0')%2

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=