Watering Grass (贪心,最小覆盖)

参考:  

https://blog.csdn.net/shuangde800/article/details/7828675

https://www.cnblogs.com/haoabcd2010/p/6171794.html?utm_source=itdadao&utm_medium=referral

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6
 7
 8 using namespace std;
 9
10 struct node
11 {
12     double L;
13     double R;
14 }a[10010];
15
16 bool cmp(node a, node b)
17 {
18     return a.R > b.R;
19 }
20
21 void sort_node(int n)
22 {
23     for (int i=0;i<n;i++)
24     {
25         int k=i;
26         for (int j=i+1;j<n;j++)
27         {
28             if (a[j].R>a[k].R)
29                 k=j;
30         }
31         swap(a[k],a[i]);
32     }
33 }
34
35 int main()
36 {
37     int n;
38     double length, wide;
39     double center, radius;     // c为圆心,r为半径
40     double t;
41     while(scanf("%d%lf%lf", &n, &length, &wide) != EOF)
42     {
43         for(int i = 0; i < n; ++i)
44         {
45             cin >> center >> radius;
46             t = sqrt(radius*radius - (wide/2.0)*(wide/2.0));
47             a[i].L = center - t;
48             a[i].R = center + t;
49         }
50
51         //sort(a, a+n, cmp);    快排不知道为什么不能AC
52         sort_node(n);
53
54         double border = 0;
55         int cnt = 0;
56         while(border < length)
57         {
58             int i;
59             for(i = 0; i < n; ++i)
60             {
61                 if(a[i].L <= border && a[i].R > border)
62                 {
63                     border = a[i].R;
64                     cnt++;
65                     break;
66                 }
67             }
68
69             if(i == n)    // 如果i==n,说明遍历完了这n个区间,仍然没有找到符合条件的,即不能完全覆盖
70                 break;
71         }
72
73         if(border < length)
74             cout << -1 << endl;
75         else
76             cout << cnt << endl;
77     }
78
79     return 0;
80 }

原文地址:https://www.cnblogs.com/FengZeng666/p/11120490.html

时间: 2024-10-11 03:36:14

Watering Grass (贪心,最小覆盖)的相关文章

uva 10382 Watering Grass(贪心)

uva 10382 Watering Grass n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each sprinkler is installed at the horizontal center line of the strip. For each sprinkler we are given its position as the distance f

10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖

double qiuzhi(int id) { double t1=cc[id].rid*cc[id].rid; double t2=w*w/4; double t3=t1-t2; double t4=sqrt(t3); return t4; } void to_qujian() { for(int i=0; i<t; i++) { double zhi=qiuzhi(i); qq[i].a=cc[i].pos-zhi; qq[i].b=cc[i].pos+zhi; } } 典型的贪心区间覆盖问

uva10382 - Watering Grass(区间覆盖变形)

题目:uva10382 - Watering Grass(区间覆盖变形) 题目大意:要给一片草坪浇水,给定草坪的长度和宽度,给出每个喷头的圆心C和喷水的半径R,问最少要几个喷头可以给整片草坪都浇上水. 解题思路:区间覆盖问题的变形,因为草坪有宽度W,所以这个每个喷头的有效范围是[C- sqrt(R* R - 0.25 * W * W   ,  C + sqrt (R*R - 0.25 * W *W)]. 代码: #include <stdio.h> #include <algorithm

UVa 10382 Watering Grass (区间覆盖贪心问题+数学)

题意:有一块长为l,宽为w的草地,在其中心线有n个喷水装置,每个装置可喷出以p为中心以r为半径的圆, 选择尽量少的装置,把草地全部润湿. 析:我个去啊,做的真恶心,看起来很简单,实际上有n多个坑啊,首先这个题,应该可以看出来是贪心算法, 具体的说是区间覆盖问题,这个问题总体来说不难,但是在这有了巨多的坑.要注意以下几点: 1.这是一个草坪,不是线段,首先你要先把实验室转化为线段. 2.这个喷水装置喷出是圆,不是矩形,要运用数学知识进行运算. 3.输入的半径的两倍如果小于等于宽度,就得忽略不记.因

UVA 10382 Watering Grass(区间覆盖,贪心)题解

题意:有一块草坪,这块草坪长l 米,宽 w 米,草坪有一些喷头,每个喷头在横坐标为 p 处,每个喷头的纵坐标都是(w/2) ,并且喷头的洒水范围是一个以喷头为圆心,半径为 r 米的圆.每次最少需要打开多少个喷头来给草坪洒水,并且草坪各处都能被洒到,不行输出-1 思路:这是一道区间覆盖(贪心)题: 有一堆区间 l1, r1:l2, r2...ln,rn,问你最少用几个能覆盖0~P的长度 那么我们先按照L升序排序,far是目前所能找到的最远处,R是上一次查询所能找到的最远处,每次查询我们都要找后面满

UVa 10382 - Watering Grass 解题心得

原题: n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each sprinkler is installed at the horizontal center line of the strip. For each sprinkler we are given its position as the distance from the left end of t

UVA 10382 Watering Grass

问题可以转化为草坪的边界被完全覆盖.这样一个圆形就换成一条线段. 贪心,从中选尽量少的线段把区间覆盖,按照把线段按左端点排序,记录一个当前已经覆盖区间的位置cur, 从左端点小于等于cur选一个右端点最大的作为这次选的区间,如果没有符合条件的,说明不可能完全覆盖. r*r会爆int... #include<bits/stdc++.h> using namespace std; const int maxn = 1e4+5; int n,l,w; struct seg { double l,r;

uva 10382 - Watering Grass(区域覆盖问题)

Sample Input 8 20 2 5 3 4 1 1 2 7 2 10 2 13 3 16 2 19 4 3 10 1 3 5 9 3 6 1 3 10 1 5 3 1 1 9 1 Sample Output 6 2 -1 题目大意: 有一块草坪,长为l,宽为w,在它的水平中心线上有n个位置可以安装喷水装置,各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆.求出最少需要的喷水装置个数. 分析与总结: 这题的关键在于转化 根据这图可以看出,一个喷水装置的有效覆盖范围就是圆中间的那个矩

Uva 10382 (区间覆盖) Watering Grass

和 Uva 10020几乎是一样的,不过这里要把圆形区域转化为能够覆盖的长条形区域(一个小小的勾股定理) 学习一下别人的代码,练习使用STL的vector容器 这里有个小技巧,用一个微小量EPS来弥补浮点运算中的误差 1 //#define LOCAL 2 #include <vector> 3 #include <cstdio> 4 #include <cmath> 5 #include <algorithm> 6 #include <functio