【贪心】「poj1328」Radar Installation
建模:二维转一维;贪心
Description
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
Figure A Sample Input of Radar Installations
Input
The input is terminated by a line containing pair of zeros
Output
Sample Input
3 2
1 2
-3 1
2 1 1 2
0 2 0 0
Sample Output
Case 1: 2
Case 2: 1
鄙人仍然码力不够……建模虽然很快就建出来了,但是写了老半天交了近十发才磕磕碰碰A掉此题。
先来分析一下吧
题意
有n个在一二象限上的整点,要求在x轴上选取ans个点,满足以每个点为圆的图形并集包含n个整点且ans最小。
分析
因为这里每个监测站的有效范围为圆形,我们可以反过来以n个整点为圆心,d为半径作圆。每个圆在x轴上有两个交点,即映射后的线段,那么在这条线段上至少要有一个监测站。想到这里我马上就想起以前做过的一道叫做“监测站”的题目,于是很快开写了。
CE第一发
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct seg{int l,r;}f[];
bool cmp(seg a, seg b){return a.r<b.r;}
int n,d,ans;
inline void mapping(int x, int y, int i)
{
int ss = (int)sqrt(d*d-y*y);
f[i].l = x-ss;
f[i].r = x+ss;
return;
}
inline void work()
{
memset(f, , sizeof(f));
ans = -;
for (int i=; i<=n; i++)
{
int x,y;
scanf("%d%d",&x,&y);
if (y > d)return;
mapping(x, y, i);
}
ans = ;
sort(f+, f+n+, cmp);
int i = ;int j = ;
while (j<=n)
{
ans++;
while(f[j].l<=f[i].r&&j<=n)j++;
i = j;
}
return;
}
int main()
{
scanf("%d%d",&n,&d);
while (n!=&&d!=)
{
work();
printf("%d\n",ans);
scanf("%d%d",&n,&d);
}
return ;
}
然后,愉快快快快快快快地CE了:)
woc在poj上面sqrt(int)会爆我的天哪。
解决方法:
1.$sqrt(int * 1.0)$
2.$sqrt((double) int)$
3.$sqrtf(int)$
WA第一发
隐隐发觉:似乎监测点可以不在整点上?把segment的l,r改成double
然而不只有这个错
WA第二发
手算一组数据发现线段要按左端点排序
然而不只有这个错
WA第三发
逐条check时候更新不对
WA第四发
第四发交的
好的吧显而易见第四发也是错的
WA第五发
已经心态爆炸
找了一组讨论区里的数据跑了跑,发现!
我在判不可能情况时候就在子过程里return了
但这是多组数据啊!没读完的被当成下组数据读进去了……
还有,我一直把输出里的"Case"当成看看的……(毕竟有些USACO的题不就这样么)
没想到它居然是要输出的:)
AC这一发
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct seg{double l,r;}f[];//WA-1
bool cmp(seg a, seg b){return a.l-b.l<1E-;}//WA-2
int n,d,ans;
inline void mapping(int x,int y, int i)
{
double ss = sqrt(d*d*1.0-y*y*1.0);
f[i].l = x*1.0-ss;
f[i].r = x*1.0+ss;
return;
}
inline void work()
{
memset(f, , sizeof(f));
ans = -;
bool fl = ;
for (int i=; i<=n; i++)
{
int x,y;
scanf("%d%d",&x,&y);
if (y > d)fl = 1;
mapping(x, y, i);
}if (fl)return;
ans = ;
sort(f+, f+n+, cmp);
int i = ;int j = ;
while (j<=n)
{
ans++;
while((f[j].l-f[i].r<=1E-)&&j<=n)
{
j++;
if (f[j].r-f[i].r < 1E-)i = j; //WA-3 WA-4
}
i = j;
}
return;
}
int main()
{
scanf("%d%d",&n,&d);
int t = ;
while (n!=||d!=)
{
t++;
work();
printf("Case %d: %d\n",t,ans); //WA-5
scanf("%d%d",&n,&d);
}
return ;
}
代码能力差还得多写题啊~
【贪心】「poj1328」Radar Installation的更多相关文章
- 「个人训练」Radar Installation(POJ-1328)
这条题目A了十次...emmmmm 其实不难就是一个贪心.... 先说下算法(之前的和现在的) 之前考虑的其实很简单.用平面几何即可将雷达可以放置的区域转化为区间(顺便判断是否无解.问题就比较简单了: ...
- POJ--1328 Radar Installation(贪心 排序)
题目:Radar Installation 对于x轴上方的每个建筑 可以计算出x轴上一段区间可以包含这个点 所以就转化成 有多少个区间可以涵盖这所有的点 排序之后贪心一下就ok 用cin 好像一直t看 ...
- POJ1328 Radar Installation 【贪心·区间选点】
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54593 Accepted: 12 ...
- [POJ1328]Radar Installation
[POJ1328]Radar Installation 试题描述 Assume the coasting is an infinite straight line. Land is in one si ...
- POJ 1328 Radar Installation 贪心 A
POJ 1328 Radar Installation https://vjudge.net/problem/POJ-1328 题目: Assume the coasting is an infini ...
- 贪心 POJ 1328 Radar Installation
题目地址:http://poj.org/problem?id=1328 /* 贪心 (转载)题意:有一条海岸线,在海岸线上方是大海,海中有一些岛屿, 这些岛的位置已知,海岸线上有雷达,雷达的覆盖半径知 ...
- POJ1328——Radar Installation
Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side ...
- poj 1328 Radar Installation(贪心)
Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...
- poj 1328 Radar Installation (简单的贪心)
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42925 Accepted: 94 ...
随机推荐
- CZGL.AliIoTClient 文档:说明
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- gcd(2018.10.24)
良心题,暴力枚举即可. 代码: #include<cstdio> #include<cmath> #include<algorithm> using namespa ...
- MySQL习题1 一对多实例 产品和分类
/* 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- ----------------- ...
- 网络流--Dinic(自用,勿看)
注意:这是一篇个人学习笔记,如果有人因为某些原因点了进来并且要看一下,请一定谨慎地阅读,因为可能存在各种奇怪的错误,如果有人发现错误请指出谢谢! https://www.luogu.org/probl ...
- JAVA常用知识总结(十二)——数据库(二)
MySQL主从热备份工作原理 简单的说:就是主服务器上执行过的sql语句会保存在binLog里面,别的从服务器把他同步过来,然后重复执行一遍,那么它们就能一直同步啦. 整体上来说,复制有3个步骤: 作 ...
- jQuery addClass() 源码解读
addClass: function( value ) { var classes, elem, cur, clazz, j, i = 0, len = this.length, proceed = ...
- js实现文本框验证和实现小数的加减乘除
<script type="text/javascript"> //加法 var m=accAdd(1.22,1.22); //减法 var m1=accSub(1.2 ...
- 初识requestAnimationFrame
转载地址:https://blog.csdn.net/vhwfr2u02q/article/details/79492303 核心概念: 1.CPU节能:在页面不刷新时不执行回调(页面在隐藏.最小化等 ...
- js对象引用的注意
var p = {}; var arr = []; function a(param) { // var i = param.a; for (var i = 0; i < 3; i++) { p ...
- 为什么字符串String是不可变字符串&&"".equals(str)与str.equals("")的区别
为什么字符串String是不可变字符串 实际上String类的实现是char类型的数组 虽然说源码中设置的是private final char[] value; final关键词表示不可变动 但是只 ...