zoukankan      html  css  js  c++  java
  • poj 1328 Radar Installation

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

    贪心。

    看了几个解题报告都说是水题,解题方法也很简单,但是不明白为什么。。。

    网上好多代码提交都是wa的,真心醉了……

    对于每个小岛,在海岸上有一个区间可以覆盖它。把区间的按左边界排序,然后从左到右扫一遍,记录一个值temp为当前区间的右边界,如果下一个区间的左边界大于temp,结果加一,更新到下一个点,如果下一个区间的右边界都小于temp,令temp等于下一个区间右边界。

    AC代码

    /********************************************
    Problem: 1328		User: 
    Memory: 688K		Time: 16MS
    Language: G++		Result: Accepted
    *********************************************/
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <math.h>
    
    using namespace std;
    
    const int N = 1005;
    int n, d;
    
    struct point {
        double x, y;
        bool operator < (const point a) const
        {
            return x < a.x;
        }
    } p[N];
    
    int solve()
    {
        int i;
    
        sort(p, p + n);
    //    for (i = 0; i < n; ++i) {
    //        printf("%d:%f,%f
    ", i, p[i].x, p[i].y);
    //    }
        int ans = 1;
        double temp = p[0].y;
        for (i = 1; i < n; ++i) {
            if (p[i].x > temp) {
                ++ans;
                temp = p[i].y;
    
            } else if (p[i].y < temp) {
                temp = p[i].y;
            }
        }
    
        return ans;
    }
    
    int main()
    {
        int i, j = 1;
        while (scanf("%d%d", &n, &d) != EOF) {
            if (n == 0 && d == 0) break;
            int flag = 0;
            int x, y;
            for (i = 0; i < n; ++i) {
                scanf("%d%d", &x, &y);
                if (y > d) flag = 1;
                p[i].x = x - sqrt((double)d * d - y * y);
                p[i].y = x + sqrt((double)d * d - y * y);
            }
            printf("Case %d: %d
    ", j++, flag ? -1 : solve());
        }
        return 0;
    }
    

      

    在 Discuss区找到了一份大神大数据:

    2 5
    -3 4
    -6 3
    
    
    4 5
    -5 3
    -3 5
    2 3
    3 3
    
    20 8
    -20 7
    -18 6
    -5 8
    -21 8
    -15 7
    -17 5
    -1 5
    -2 3
    -9 6
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    7 8
    8 7
    9 6
    10 5
    0 0
    
    2 3
    0 2
    2 3
    
    2 3
    0 2
    1 3
    
    3 3
    1 2
    -3 2
    2 4
    
    8 5
    2 4
    -4 4
    -3 3
    -3 1
    -3 0
    -1 0
    0 5
    6 0
    
    3 0
    1 2
    -3 1
    2 1
    
    3 2
    1 2
    -3 1
    2 1
    
    1 2
    0 2
    
    
    2 3
    0 2
    2 3
    
    4 -5
    4 3
    4 3
    2 3
    6 -9
    
    
    
    3 -3
    1 2
    -3 2
    2 1
    
    6 2
    1 2
    1 2
    1 2
    -3 1
    2 1
    0 0
    
    1 2
    0 2
    
    2 3
    0 2
    1 3
    
    3 10
    1 10
    2 3
    4 5
    
    3 5
    1 10
    2 3
    4 5
    
    4 7
    1 10
    2 3
    4 5
    0 0
    
    3 9
    1 10
    2 3
    4 5
    0 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
  • 相关阅读:
    【转】寻找最好的笔记软件:海选篇 (v1.0)
    【转】git rebase简介(基本篇)
    【转】学会这13个原则写UI界面文案,用户才能秒懂
    sqlserver巧用row_number和partition by分组取top数据
    使用SQL语句清空数据库所有表的数据
    在 SQL Server 2005 中配置数据库邮件
    SQL compute by 的使用
    SQL Cursor 基本用法
    Sqlserver双机热备文档(无域)
    查询分页的几种Sql写法
  • 原文地址:https://www.cnblogs.com/wenruo/p/4692987.html
Copyright © 2011-2022 走看看