ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖。问最后能够有几个圆被看见。。
。
对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这个点,能盖住这个点的最上面的圆一定是可见的
Viva Confetti
Time Limit: 2 Seconds Memory Limit: 65536 KB
Do you know confetti?
They are small discs of colored paper, and people throw them around during parties or festivals. Since people throw lots of confetti, they may end up stacked
one on another, so there may be hidden ones underneath.
A handful of various sized confetti have been dropped on a table. Given their positions and sizes, can you tell us how many of them you can see?
The following figure represents the disc configuration for the first sample input, where the bottom disc is still visible.

Input
The input is composed of a number of configurations of the following form.
n
x1 y1 r1
x2 y2 r2
. . .
xn yn rn
The first line in a configuration is the number of discs in the configuration (a positive integer not more than 100), followed by one line descriptions of each disc: coordinates of its
center and radius, expressed as real numbers in the decimal notation, with up to 12 digits after the decimal point. The imprecision margin is 5*10^-13. That is, it is guaranteed that variations of less than 5*10^-13 on input values do not change which discs
are visible. Coordinates of all points contained in discs are between -10 and 10.
Confetti are listed in their stacking order, x1 y1 r1 being the bottom one and xn yn rn the top one. You are observing from the top.
The end of the input is marked by a zero on a single line.
Output
For each configuration you should output the number of visible confetti on a single line.
Sample Input
3
0 0 0.5
-0.9 0 1.00000000001
0.9 9 1.00000000001
5
0 1 0.5
1 1 1.00000000001
0 2 1.00000000001
-1 1 1.00000000001
0 -0.00001 1.00000000001
5
0 1 0.5
1 1 1.00000000001
0 2 1.00000000001
-1 1 1.00000000001
0 0 1.00000000001
2
0 0 1.0000001
0 0 1
2
0 0 1
0.00000001 0 1
0
Sample Output
3
5
4
2
2
Source: Asia 2002, Kanazawa (Japan)
Submit
problemId=696" style="color:blue; text-decoration:none">Status
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> using namespace std; const double eps=5*(1e-13);
const double pi=acos(-1.0); int n; struct Point
{
double x,y;
Point(){}
Point(double _x,double _y):x(_x),y(_y){}
}; struct Circle
{
Point c;
double r;
Circle(){}
Circle(Point _c,double _r):c(_c),r(_r){}
Point point(double x) {return Point(c.x+cos(x)*r,c.y+sin(x)*r);}
}; double normal(double x)
{
return x-floor(x/(2*pi))*2*pi;
} double dcmp(double x)
{
if(fabs(x)<=eps) return 0;
return (x<0)? -1:1;
} double DIST(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} Circle C[200];
double a[1000];
int tot=0;
bool flag[110]; void check(Point x)
{
for(int i=n-1;i>=0;i--)
{
double d=DIST(x,C[i].c);
if(dcmp(d-C[i].r)<0)
{
flag[i]=true; break;
}
}
} int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++)
{
double x,y,z;
scanf("%lf%lf%lf",&x,&y,&z);
C[i]=Circle(Point(x,y),z);
} for(int i=0;i<n;i++)
{
tot=0;
for(int j=0;j<n;j++)
{
if(i==j) continue;
double dist=DIST(C[i].c,C[j].c);
double ri=C[i].r,rj=C[j].r;
if(dcmp(dist-ri-rj)>=0||dcmp(dist-fabs(ri-rj))<=0) continue;
double t=atan2(C[j].c.y-C[i].c.y,C[j].c.x-C[i].c.x);
double dt= acos((ri*ri+dist*dist-rj*rj)/(2.*ri*dist));
a[tot++]=normal(t+dt); a[tot++]=normal(t-dt);
}
a[tot++]=0;a[tot++]=2*pi;
sort(a,a+tot);
tot=unique(a,a+tot)-a;
for(int j=0;j<tot-1;j++)
{
double u=(a[j]+a[j+1])/2;
double r1=C[i].r+eps,r2=C[i].r-eps;
Point p1=Point(C[i].c.x+r1*cos(u),C[i].c.y+r1*sin(u));
Point p2=Point(C[i].c.x+r2*cos(u),C[i].c.y+r2*sin(u));
check(p1); check(p2);
}
}
int ans=0;
for(int i=0;i<n;i++)
if(flag[i]) ans++;
printf("%d\n",ans);
}
return 0;
}
ZOJ 1696 Viva Confetti 计算几何的更多相关文章
- poj1418 Viva Confetti 判断圆是否可见
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Viva Confetti Time Limit: 1000MS Memory ...
- poj 1418 Viva Confetti
Viva Confetti Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1025 Accepted: 422 Desc ...
- uva 2572 Viva Confetti
思路: 小圆面是由小圆弧围成.那么找出每条小圆弧,如果小圆弧,在小圆弧中点上下左右进行微小位移的所得的点一定在一个小圆面内. 找到最后覆盖这个小点的圆一定是可见的. 圆上的点按照相邻依次排序的关键量为 ...
- uva 1308 - Viva Confetti
这个题目的方法是将圆盘分成一个个圆环,然后判断这些圆环是否被上面的圆覆盖: 如果这个圆的圆周上的圆弧都被上面的覆盖,暂时把它标记为不可见: 然后如果他的头上有个圆,他有个圆弧可见,那么他自己本身可见, ...
- UVaLive2572 poj1418 UVa1308 Viva Confetti
一次放下n个圆 问最终可见的圆的数量 应该是比较经典的问题吧 考虑一个圆与其他每个圆的交点O(n)个 将其割成了O(n)条弧 那么看每条弧的中点 分别向内向外调动eps这个点 则最上面的覆盖这个点的圆 ...
- ZOJ 2675 Little Mammoth(计算几何)
圆形与矩形截面的面积 三角仍然可以做到这一点 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- zoj 3537 区间dp+计算几何
题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...
- LA2572 Viva Confetti
题意 PDF 分析 两两圆求交点,对每个圆弧按半径抖动. 时间复杂度\(O(T n^2)\) 代码 #include<iostream> #include<cstdio> #i ...
- [GodLove]Wine93 Tarining Round #9
比赛链接: http://vjudge.net/contest/view.action?cid=48069#overview 题目来源: lrj训练指南---二维几何计算 ID Title Pro ...
随机推荐
- Codeforces Round #282 (Div. 1)B. Obsessive String KMP+DP
B. Obsessive String Hamed has recently found a string t and suddenly became quite fond of it. He s ...
- linux下使用convert命令修改图片分辨率【转】
本文转载自:http://blog.csdn.net/mybelief321/article/details/9969949 Convert的resize子命令应该是在ImageMagick中使用较多 ...
- DPI深度报文检测架构及关键技术实现
DPI深度报文检测架构及关键技术实现 当前DPI(Deep Packet Inspect深度报文识别)技术是安全领域的关键技术点之一,围绕DPI技术衍生出的安全产品类型也非常的多样.在分析DPI的进一 ...
- Adding Kentico controls to the Visual Studio toolbox
https://docs.kentico.com/k10/references/kentico-controls https://docs.kentico.com/k10/references/ken ...
- Asp.Net Core部署到Linux服务器
从2016年7月, .NET Core1.0 正式发布开始,由于时间问题,我没怎么关注过.NET Core,最近刚抽出点时间研究了下,先讲下如何把ASP.NET Core部署到Linux上吧.这里我用 ...
- UWP 开发相关
OCR 识别问题 ocr.OcrEngine.availableRecognizerLanguages 如果 length 只有 1,有可能只能识别英文,需要安装中文语言包~
- Win10 UI入门 导航滑动条 求UWP工作
借鉴了 段博琼 大哥写的导航滑动,自己实现了一个类似安卓 IOS 导航滑动条 支持等比例 分割 tabView 支持动画滑动 效果如下图 WYGrid 你可以想象一个GridView itemsWr ...
- 产品开发也要看阵容,APP开发只需五步变得靠谱
最早认识的一个朋友是程序员,曾经到一家外包公司接单子,小外包公司经常遇到的问题就是和需求方谈产品功能.客户要做外包,对方让他一次性报价,但是客户连功能点自己都不清楚,这时朋友说还是按照具体功能点来做吧 ...
- 不懂技术也可以轻松开发一款APP
这是个衣食住行都离不开手机的时代,甚至可以说,我们不用考虑其他的东西,只要拿着手机,就可以出门做自己想做的事情. 这就是手机app的强大之处,覆盖面极广,小到聊天交友,大到投资理财.每次都是app为我 ...
- 指定的WSDL可能与所选的工具包不兼容
使用LoadRunner在webservice协议下,import service的时候,报错: can not fetch WSDL,the specified WSDL datathe speci ...