UVA10382 - Watering Grass 题解
原题链接
- Online Judge: 10382 - Watering Grass
- Virtual Judge: Watering Grass - UVA 10382
- 洛谷:UVA10382 Watering Grass
- LibreOJ:#10002. 「一本通 1.1 例 3」喷水装置,题目稍有不同,数据组数确定为 TTT。
解决题目
先通过勾股定理求出每个圆向左向右实际能覆盖的距离 kkk,将题目中的圆转化为矩形。
可以看出来这是一道贪心问题。我这里使用的方法是从右往左覆盖草坪,并用 lastlastlast 标记当前覆盖到的位置。
每次循环中从左向右枚举右侧(ededed)能到达当前位置 lastlastlast 的圆圈。标记出现的第一个符合要求的圆圈,lastlastlast 跳到该圆圈的左侧(ststst)。因为这些圆圈已经按照左侧(ststst)由大到小的顺序排序,因此枚举出来的一定是符合要求的最靠左侧的圆圈,覆盖草坪的速度最快,且不用考虑对之后选择的影响,因此一定最优。
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>using namespace std;const int N = 10000;struct node {double st;double ed;bool operator < (const node &K) const {return st < K.st;//排序时 st 小的在前}
}a[N + 5];int n, cnt, l, w;
double ww;int main() {while (~scanf("%d%d%d", &n, &l, &w)) {ww = double(w) / 2;cnt = 0;for (int i = 1; i <= n; i++) {double x, y, k;scanf("%lf%lf", &x, &y);if (y <= ww) {//如果连宽度也不能覆盖则跳过continue;}cnt++;k = sqrt(y * y - ww * ww);//计算向左向右实际覆盖距离a[cnt].st = x - k;a[cnt].ed = x + k;}n = cnt;sort(a + 1, a + n + 1);double last = l;int lastp = n + 1;int ans = 0;bool flag;while (last > 0) {flag = false;for (int i = 1; i < lastp; i++) {//只循环到上一次符合要求的圆圈所在位置if (a[i].ed >= last && a[i].st < last) {flag = true;last = a[i].st;lastp = i;ans++;break;}}if (!flag) {//没有找到符合要求的圆圈,无法完成浇灌printf("-1\n");break;}}if (flag) {printf("%d\n", ans);}}return 0;
}
注意事项
- 题目是多组数据,组数不指定。我这里使用
while (~scanf("%d%d%d", &n, &l, &w))
,当读到文件结尾时终止循环; - 第 28 行,如果连宽度都不能覆盖则跳过;我刚开始时没有跳过,导致之后循环时加上了这些圆圈。会导致除样例外全错;
- 第 46 行我用了一个 lastplastplastp 变量,目的是让循环时只循环到上一次符合要求的圆圈,减少无法复制时的循环次数;
- 题目是多组数据,因此 cntcntcnt 等变量需要初始化,避免影响这次循环。
- LibreOJ 或一本通中的题目稍有不同,数据组数确定为 TTT。每次循环减去一并判断即可:
int T;
scanf("%d", &T);
while (T--) {...
}
UVA10382 - Watering Grass 题解相关推荐
- UVa-10382 Watering Grass **
/* * Uva-10382-Watering Grass.cpp * 特别注意精度..(感觉这道题的判题有问题,开始怎么交都WA,,过两天什么都没改,再交就AC了 , 汗.. * * 详细代码注释: ...
- UVA-10382 Watering Grass
题意:有一个长方形草坪,长为l,宽为w,在它的水平中心线上可以安装n个喷水器来为草坪浇水,每个喷水器能够灌溉的范围是以该喷水器为中心的半径为r的圆.我们要灌溉整个草坪,问你最少需要的喷水器数. 题解: ...
- UVa10382 - Watering Grass(贪心算法)
问题:给出一个长为l,宽为w的绿化带,n个喷水装置及其对就位置x和影响半径r.问最少需要多少个喷水装置能全覆盖此绿化带 思路:首先要计算喷水装置可以覆盖的区间,如果喷水装置的影响半径小于等于w/2,是 ...
- uva10382 - Watering Grass
题目大意:输入n,l,w.分别代表有n个喷水装置,草地长为L,宽为W:接下来n行,每行两个数,a,r,分别代表喷水装置在草地中的横坐标,和喷水半径.喷水装置的纵坐标都是草地的正中央.求用最少的喷水装置 ...
- UVa 10382 - Watering Grass
链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&pa ...
- Watering Grass——UVA10382
题目 n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each s ...
- *【UVA - 10382】Watering Grass(贪心,区间覆盖问题,思维)
题干: 题目大意: 有一块草坪,长为l,宽为w,在它的水平中心线上有n个位置可以安装喷水装置,各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆.求出最少需要的喷水装置个数,如果无论如何都不能覆 ...
- Watering Grass UUV 1038 贪心
问题: n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each ...
- Watering Grass UVA - 10382 贪心
问题 https://vjudge.net/problem/UVA-10382 分析 将一个点的覆盖范围看作是一个长方形,舍弃弓形区域,变成区间覆盖问题,用贪心法 注意:bb-ww/4有可能小于0,要 ...
最新文章
- 极光大数据:00后王者大军来袭 荣耀手机偏偏独得恩宠
- python 常见函数_Python基础函数:初学者常用的十个Python函数,非常全面!
- 【Tools】Wireshark3.0安装教程详解
- vmware centos7 扩展容量
- oracle idl_ub1$,system表空间急剧增大原因分析
- linux tar 使用
- VS2010 字体和背景设置
- python 面试题2
- 周鸿祎:不得不说的话
- ios10发邮件服务器拒绝,IOS10用户拒绝网络权限后,如何引导开启?
- Linux VIM编辑器详解
- MySQL数据库:参数优化
- android仿黑客帝国字符雨
- 快速pow算法c语言_c语言pow(c语言中用pow算法求)
- 博弈论——4.1三人博弈的纳什均衡练习题
- 六一儿童节带娃旅游,在曼谷玩哪些景点超好玩?
- 基于asp.net综合管理系统源码,三层架构
- 用c语言绘制五角星图形,用c语言画出一个五角星图案
- PTA:修理牧场(哈夫曼算法)
- 总结常见的违背Rest原则的接口设计做法