POJ 1328 Rader Installation

来源:互联网 发布:java十个数输出最小值 编辑:程序博客网 时间:2024/06/05 05:32

区间选点问题,贪心解决。
现将区间排序,排序的方法是按区间的右端排序。
每次取区间的右端,如果下一组区间包含取到的区间右端,判断下一组,否则取区间右端。
有一次wa,是因为判断是否为-1的值在循环之后没有置0.

#include <iostream>#include <algorithm>#include <cmath>struct extent {      double l, r;    }line[1100];bool cmp(extent a, extent b) {    return a.r < b.r;}int main(int argc, char *argv[]) {      int n, d, cnt_case = 0, ok;    while(std::cin >> n >> d) {        ok = 1;        if(n == 0 && d == 0) {            break;        }        double x, y;        for(int i = 0; i < n; i++) {            std::cin >> x >> y;            double temp = double(d * d) - y * y;            if(temp < 0 || d < 0) {                ok = 0;            } else {                line[i].l = x - sqrt(temp);                line[i].r = x + sqrt(temp);            }                   }        if(!ok) {            cnt_case ++;            std::cout << "Case " << cnt_case << ": -1"<< std::endl;        } else {            std::sort(line, line + n, cmp);            int ans = 1;            double temp = line[0].r;            for(int i = 1; i < n; i++) {                if(temp < line[i].l) {                    ans++;                    temp = line[i].r;                }                           }            cnt_case ++;            std::cout << "Case " << cnt_case << ": " << ans << std::endl;        }           }    return 0;}
原创粉丝点击