zoukankan      html  css  js  c++  java
  • POJ 1328 贪心

    /*
     *POJ 1328 看了解题报告。觉得思路很简单。就是把每个island的区间求出来。方法是也就是以该island为圆心,画半圆。和x-axis的两交点就是区间端点。
     *然后。temp为第一个点的右端点。ans = 1。开始遍历。如果遇见一个点的左端点大于temp。就ans++。temp重新设为这个点的右端点。即又安了一个雷达。
     *最后输出ans就好了。
     *因为没有考虑d<0的情况。所以WA了几次。果然出数据的人都是不可靠的。
     *还有就是 输入循环里的break 和 外层循环里的 continue ...各种debug...
     */

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    #define tot 1000+10

    struct Interval  // 保存每个点的可设雷达区间。
    {
        double left, right;
    } interval[tot];

    struct Point
    {
        int x, y;
    } point[tot];

    int n, d, ans;
    int i, j, k;
    int cnt = 0;

    double cmp(Interval a, Interval b)   //对区间排序
    {
        if (a.right != b.right)
            return a.right < b.right;
        else return a.left < b.left;
    }

    int main()
    {
        ans = 0;
        bool flag = true;
        while(cin >> n >> d)
        {
            flag = true;
            ans = 0;
            if (n == 0 && d == 0)
                break;
            if (d < 0) flag = false;   // 数据并没有说 d>=0 ...没有结果输出-1的情况。
            cout << "Case " << ++cnt << ": ";

            for (i=0; i<n; ++i)
            {
                cin >> point[i].x >> point[i].y;
                double ans = d*d - point[i].y*point[i].y;   //计算每个小岛的区间范围。
                if (ans < 0)
                {
                    flag = false;
                   // break;   // break会使输入中断。
                }
                else if (flag)
                {
                   ans = sqrt(ans);
                   interval[i].left = point[i].x - ans;
                   interval[i].right = point[i].x + ans;
                }
            }

            if (!flag)
            {
                cout << -1 << endl;
                continue;    // 不是break.
            }

            sort(interval, interval+n, cmp);
            double temp = interval[0].right;
            ans += 1;

            for (int i=1; i<n; ++i)
            {
                if (interval[i].left > temp)  // 新安上一个雷达。
                {
                   ans += 1;
                   temp = interval[i].right;
                }
            }
            cout << ans << endl;
        }
        return 0;
    }

  • 相关阅读:
    ColoFolXS for Mac 2.0.1高级取色工具。
    Airmail for Mac 5.1 强大的、最小的电子邮件客户端。
    Downcast for Mac 2.11.1 下载、播放和同步您的播客。
    iCollections for Mac 7.1.3 整理您的桌面图标。
    Aurora HDR 2019 for Mac 1.0.1 高级 HDR 软件。
    oracle树结构查询
    windows注册表:开机启动的程序
    chm提取html
    oracle忘记sys密码处理
    点击文字实现radio 选中(不使用js)
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4663825.html
Copyright © 2011-2022 走看看