UVA

来源:互联网 发布:杭州创业软件 编辑:程序博客网 时间:2024/06/08 15:28

点击打开题目链接

题目大意:

给出长为l,宽为w的一块长方形草地。草地上有n个喷头,给出每个喷头的圆心坐标及半径。求解最少需要多少喷头覆盖整个长方形。

思路:

将圆形区间转化成长方形区间。每个圆与草地相交的四个点为长方形的四个顶点。然后贪心求解。

附上AC代码:

#include<iostream>#include<algorithm>#include<cmath>using namespace std;const int maxn = 10000 + 5;double n;double l, w;struct nodes {    double l, r;}node[maxn];bool cmp(nodes a, nodes b) {    return a.l < b.l;}int main() {    ios::sync_with_stdio(false);    while(cin >> n >> l >> w) {        int cnt = 0;        double o, r;        for(int i = 0; i < n; i++) {            cin >> o >> r;            if(r * 2 < w) continue;            else {                double t = sqrt( r * r - (w / 2) * (w / 2) );                node[cnt].l = o - t;                node[cnt++].r = o + t;            }        }        sort(node, node + cnt, cmp);        if(node[0].l > 0) {            cout << -1 << endl;            continue;        }        int ans = 0;        double tmp = 0, ln = 0;        while(ln < l) {            tmp = ln;            for(int i = 0; i < cnt; i++)                if(node[i].l <= ln && node[i].r > tmp)                    tmp = node[i].r;            if(tmp == ln) {                ans = -1;                break;            }            ln = tmp;            ans++;        }        cout << ans << endl;    }    return 0;}