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

  • 相关阅读:
    jQuery Timer 实现的新邮件提醒
    在 jquery repeater 中添加设置日期,下拉,复选框等控件
    jquery repeater 完成 QQ 邮箱邮件分组显示功能
    Ajax 与 WebService 之间日期等数据类型的转换
    通过 Parameter 对象添加 Ajax 请求时的参数
    在 jQuery Repeater 进行验证更新等操作时提示消息
    jquery repeater 模仿 Google 展开页面预览子视图
    在 jQuery Repeater 中检索过滤数据
    功能完善的 jquery validator 完成用户注册的验证
    在 Repeater 中绑定转化 JSON 格式的字段
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4663825.html
Copyright © 2011-2022 走看看