题目大意:给定n个点。要求建造尽量少得铁路(从原点发射出的射线)。使得全部点到铁路的最短距离小于d。

解题思路:题目能够转化成区间选点问题,即以极角来表示铁轨。然后计算出每一个区间可行的极角范围,进行区间选点。

注意:(1)假设点到原点的距离dis<=d的话。不进行考虑,也无法推断。由于没有说直角边大于等于斜边的。

(2)区间有可能在二三象限时重叠,我的处理方法是每次枚举起始点,进行n次选点问题。

(3)由于每次都将区间i的左右区间+2pi后放到最后。忘记考虑s[i].r+2pi 有可能小于 s[m-1].r的情况,所以一直WA。

处理。在初始化区间时,将右区间大于pi的统一左右区间减掉2pi。

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; double pi = acos(-1);
int cnt; struct Point {
double l, r;
bool operator < (Point a) const {
return r < a.r;
}
} A[500]; double cal(double x, double y) {
return sqrt(x*x + y*y);
} int solve() {
sort(A, A + cnt);
for (int i = 0; i < cnt; i++) {
A[i + cnt].l = A[i].l + 2 * pi;
A[i + cnt].r = A[i].r + 2 * pi;
} int ans = cnt;
for (int i = 0; i < cnt; i++) {
double val = A[i].r;
int tmp = 1;
for (int j = i + 1; j < cnt + i; j++) if (A[j].l > val + 1e-9) {
val = A[j].r;
tmp++;
}
ans = min(ans, tmp);
} return ans;
} int main() {
int N;
scanf("%d", &N);
while (N--) {
int n;
double d, x, y;
scanf("%d%lf", &n, &d);
cnt = 0;
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &x, &y);
if (cal(x, y) <= d) continue;
double angle = atan2(y, x);
double range = asin(d / cal(x, y));
A[cnt].l = angle - range;
A[cnt++].r = angle + range;
if (A[cnt-1].r <= pi) continue;
A[cnt-1].r -= 2 * pi;
A[cnt-1].l -= 2 * pi;
} printf("%d\n", solve());
}
return 0;
}

UVA - 10691 Subway的更多相关文章

  1. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  2. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  3. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  4. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  5. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  6. UVA数学入门训练Round1[6]

    UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...

  7. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  8. UVA - 10375 Choose and divide[唯一分解定理]

    UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  9. UVA - 11584 Partitioning by Palindromes[序列DP]

    UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...

随机推荐

  1. C++(extern关键字的理解和作用深入)

    extern关键字的理解和作用深入 extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数, 也会在当前文件的后面或者其它文件中定义 引 ...

  2. SqlBulkCopy实现大批量数据导入

    //自增列重新生成:SqlBulkCopy bc = new SqlBulkCopy(conn) //自增列保留原值:SqlBulkCopy bc = new SqlBulkCopy(conn,Sql ...

  3. DWARF调试格式的简介

    DWARF调试格式的简介 Michael J. Eager, Eager Consulting Feb, 2007 翻译:吴晖 2012年2月 如果我们可以编写确保能正确工作且永远不需要调试的程序,这 ...

  4. ThinkPHP---TP功能类之公文管理功能2----------继续完善

    [前言] 之前已经完成了公文的添加和列表展示功能,今天继续完善.做下公文的编辑和删除功能. [主体] (1)分析 控制器:DocController.class.php 方法:edit(将模板展示和数 ...

  5. 洛谷——P2007 魔方

    P2007 魔方 常神牛家的魔方都是3*3*3的三阶魔方,大家都见过. 模拟即可: #include<iostream> #include<cstdio> #include&l ...

  6. (C/C++学习)20.基于C++改进的单目标遗传算法

    说明:在学习生活中,经常会遇到各种各样的最优问题,其中最常见的就是求某个多维(多个自变量)函数在各个自变量各取何值时的最大值或最小值:例如求函数 f(x) = (x-5)2+(y-6)2+(z-7)2 ...

  7. UVA - 11536 Smallest Sub-Array(尺取法)

    题目: 思路: 读完题之后第一时间想到的是尺取法来做这个题,结果让自己写写崩了,还是练得少!! 到网上搜了一下学习了大佬的标记方法,用一个变量来判断是不是都已经出现,要比每次都判断一下快超多. 代码: ...

  8. sublime 使用笔记

    unbuntu安装sublime---------------------------------------------sudo add-apt-repository ppa:webupd8team ...

  9. 设置Python解析器

    如果同时安装了多个Python,如 Python2.7 和 Python3.7 .如果某些特殊原因(比如有些框架只能在Python2.7中使用),需要修改程序在 Python2.7 下运行,即可设置P ...

  10. angular中多个promise的合并处理

    all()方法 这个all()方法,可以把多个primise的数组合并成一个.当所有的promise执行成功后,会执行后面的回调.回调中的参数,是每个promise执行的结果.当批量的执行某些方法时, ...