• 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;
    }

  • 相关阅读:
    TreeView中找鼠标指向的节点
    自己写的一个分页控件源代码
    [JWF]只显示当前用户的WorkItem方法
    [JWF]安装Workflow Server后的中文界面补丁
    [JWF]JWF中调用WebService方法
    [JWF]配置Adobe Form Server Application
    [导入](HOWTO)将一个Xml中的节点复制到别一个Xml的节点上
    [JWF]Form Common button 执行生命周期
    [JWF]Special Buttons 执行生命周期
    [JWF]Participant Interface访问ActiveDirectory
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4663825.html
Copyright © 2020-2023  润新知