【贪心】「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 ...
随机推荐
- word2vec改进之Negative Sampling
训练网络时往往会对全部的神经元参数进行微调,从而让训练结果更加准确.但在这个网络中,训练参数很多,每次微调上百万的数据是很浪费计算资源的.那么Negative Sampling方法可以通过每次调整很小 ...
- C - Catch That Cow POJ - 3278
//标准bfs #include <iostream> #include <cstdio> #include <algorithm> #include <cm ...
- 111 Minimum Depth of Binary Tree 二叉树的最小深度
给定一个二叉树,找出其最小深度.最小深度是从根节点到最近叶节点的最短路径的节点数量.详见:https://leetcode.com/problems/minimum-depth-of-binary-t ...
- ZOJ Seven-Segment Display 暴力dfs + 剪枝
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3954 0 = on 1 = off A seven segment ...
- Spark Mllib里如何将数据集按比例随机地分成trainData、testData和validationData数据集(图文详解)
不多说,直接上干货! 具体详情见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第11章 电影推荐引擎
- ACM学习大纲(转)
1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...
- ASP.NET Core MVC/WebAPi 模型绑定
public class Person { public string Name { get; set; } public string Address { get; set; } public in ...
- 1099 字串变换 2002年NOIP全国联赛提高组
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- PostgreSQL函数如何返回数据集 [转]
PostgreSQL函数如何返回数据集 以下主要介绍PostgreSQL函数/存储过程返回数据集,或者也叫结果集的示例. 背景: PostgreSQL里面没有存储过程,只有函数,其他数据库里的这两个对 ...
- 十四个关于ASP.NET基础知识问答(C#版)
这是一些ASP.NET很基础的东西,希望对ASP.NET爱好者特别是刚刚入门的朋友有所帮助虽然示例代码是C#.NET,但是不影响VB.NET朋友的参考.好,继续往下看吧! 1.ASP.NET能在那些系 ...