【贪心】「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 ...
随机推荐
- Java 时区(转)
http://blog.csdn.net/wangpeng047/article/details/8560690
- 最短路之Floyd(多源)HDU 1874
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #def ...
- 292. Nim游戏
292. Nim游戏 class Solution(object): def canWinNim(self, n): """ :type n: int :rtype: b ...
- 洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作
洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...
- 微信支付——基于laravel框架的php实现
现在经手的几乎每个项目都支持微信支付,简单记录下接入的大致流程. 1.首先商户等申请各种账号,微信支付商户号,APPID,API密钥,Appsecret 2.app端上传支付需要的各个字段 3.后台收 ...
- getpass不起作用
#! /usr/bin/env python# -*- coding:utf-8 -*- # login 模块中登录时输入密码,想用getPass模块实现密码的不回显操作.#如下: import ge ...
- C. Anton and Making Potions 贪心 + 二分
http://codeforces.com/contest/734/problem/C 因为有两种操作,那么可以这样考虑, 1.都不执行,就是开始的答案是n * x 2.先执行第一个操作,然后就会得到 ...
- 181. 将整数A转换为B
181. 将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 注意事项 Both n and m are 32-bit integers. 您在真实的面试中是否遇到过这个题? Yes ...
- 【转】Effective C#观后感之提高Unity中C#代码质量的21条准则
转自:http://blog.csdn.net/swj524152416/article/details/75418162 我们知道,在C++领域,作为进阶阅读材料,必看的书是<Effectiv ...
- Ajax 提交表单【包括文件上传】
利用js插件实现 <script src="@Url.Content("~/js/layer/jquery.form.min.js")"></ ...