HDU 4116 Fruit Ninja
http://acm.hdu.edu.cn/showproblem.php?pid=4116
题意:给N个圆,求一条直线最多能经过几个圆?(相切也算)
思路:枚举中心圆,将其他圆的切线按照极角排序,并赋上权值(1\-1),那么我们for一遍,sum随时加上权值,当sum最大时,就可以更新答案。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
const double eps=1e-;
const double Pi=acos(-);
int n;
struct Point{
double x,y,r;
Point(){}
Point(double x0,double y0,double r0):x(x0),y(y0),r(r0){}
Point(double x0,double y0):x(x0),y(y0){}
}p[];
bool vis[];
struct Line{
int id,c;
double ang;
Line(){}
Line(int id0,int c0,double ang0):id(id0),c(c0),ang(ang0){}
}L[];
int sgn(double x){
if (x>eps) return ;
if (x<-eps) return -;
return ;
}
double fix(double x){
while (sgn(x)<) x+=2.0*Pi;
while (sgn(x-Pi-Pi)>=) x-=2.0*Pi;
return x;
}
bool cmp(Line p1,Line p2){
int tmp=sgn(p1.ang-p2.ang);
if (tmp) return tmp<;
else return p1.c>p2.c;
}
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
Point operator -(Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y,);
}
double sqr(double x){
return x*x;
}
double dist(Point p){
return sqrt(sqr(p.x)+sqr(p.y));
}
double dist(Point p1,Point p2){
return dist(p1-p2);
}
Point getPoint(Point p,double ang){
return Point(p.x+cos(ang)*p.r,p.y+sin(ang)*p.r);
}
void cut_line(Point &A,Point &B,int &id,int &sum,int &len){
double dis=dist(A,B);
double Base=atan2(B.y-A.y,B.x-A.x);
if (sgn(A.r-B.r-dis)>) return;
if (sgn(B.r-A.r-dis)>=){
sum++;return;
}
double ang1=asin((B.r-A.r)/dis);
double ang2=asin((B.r+A.r)/dis);
if (sgn(A.r+B.r-dis)>=){
L[++len]=Line(id,,fix(Base-ang1));
L[++len]=Line(id,-,fix(Base+ang1+Pi));
return;
}
L[++len]=Line(id,,fix(Base-ang1));
L[++len]=Line(id,-,fix(Base+ang1+Pi));
L[++len]=Line(id,-,fix(Base+ang2));
L[++len]=Line(id,,fix(Base-ang2+Pi));
return;
}
int work(int n,int len){
int res=;
int sum=;
memset(vis,false,sizeof(bool)*(n+));
for (int i=;i<=(len<<);i++){
int k=(i>len)?i-len:i;
int id=L[k].id;
int c=L[k].c;
if (c==){
if (!vis[id]){
vis[id]=true;
sum++;
}
}else{
if (vis[id]){
vis[id]=false;
sum--;
}
}
if (sum>res) res=sum;
}
return res;
}
int main(){
int T=read(),Tcase=;
while (T--){
n=read();printf("Case #%d: ",++Tcase);
for (int i=;i<=n;i++)
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].r);
int ans=;
for (int i=;i<=n;i++){
int len=;int sum=;
for (int j=;j<=n;j++) if (i!=j)
cut_line(p[i],p[j],j,sum,len);
std::sort(L+,L++len,cmp);
sum+=work(n,len);
ans=std::max(ans,sum);
}
printf("%d\n",ans);
}
return ;
}
HDU 4116 Fruit Ninja的更多相关文章
- HDU 4116 Fruit Ninja ( 计算几何 + 扫描线 )
给你最多1000个圆,问画一条直线最多能与几个圆相交,相切也算. 显然临界条件是这条线是某两圆的公切线,最容易想到的就是每两两圆求出所有公切线,暴力判断一下. 可惜圆有1000个,时间复杂度太高. 网 ...
- hdu 4000 Fruit Ninja 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...
- hdu 4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 4620 Fruit Ninja Extreme 搜索
搜索+最优性剪枝. DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个.没想清楚,TLE到死…… #include ...
- hdu - 3952 Fruit Ninja(简单几何)
思路来自于:http://www.cnblogs.com/wuyiqi/archive/2011/11/06/2238530.html 枚举两个多边形的两个点组成的直线,判断能与几个多边形相交 因为最 ...
- HDU 4000 Fruit Ninja 树状数组 + 计数
给你N的一个排列,求满足:a[i] < a[k] < a[j] 并且i < j < k的三元组有多少个. 一步转化: 求出所有满足 a[i] < a[k] < a[ ...
- HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)
这题官方结题报告一直在强调不难,只要注意剪枝就行. 这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了 #include &l ...
- hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)
对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...
- HDU 4620 Fruit Ninja Extreme 暴搜
题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...
随机推荐
- rsyslog Properties 属性:
rsyslog Properties 属性: 数据项 在rsyslog 是被称为 "properties". 它们可以有不同的源, 最重要的是 那些来自接收的消息,但是还有其他. ...
- RenderBody, RenderPage and RenderSection methods in MVC 3
原文地址:http://www.codeproject.com/Articles/383145/RenderBody-RenderPage-and-RenderSection-methods-in R ...
- HAVING 子句 (SQL Server Compact)
MSDN官方文献 原文地址:http://technet.microsoft.com/zh-cn/library/ms173260.aspx
- ZOJ2112--Dynamic Rankings (动态区间第k大)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- guestmount
guestmountFor some types of changes, you may find it easier to mount the image's file system directl ...
- 深入理解linux网络技术内幕读书笔记(七)--组件初始化的内核基础架构
Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导 ...
- MySQL的数据库引擎的类型
你能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型INNO ...
- Xshell远程连接Ubuntu
在Ubuntu系统下执行命令: sudo apt-get install openssh-server 然后,在Xshell中新建会话,输入Ubuntu系统的IP,以及用户名.密码. 但是经常会出现连 ...
- 在Spring中使用异步事件实现同步事务
结合Scala+Spring,我们将采取一个很简单的场景:下订单,然后发送一封电子邮件. 编制一个服务: @Serviceclass OrderService @Autowired() (orderD ...
- Highcharts教程
Highcharts特性: 兼容性 - 支持所有主流浏览器和移动平台(android.iOS等). 多设备 - 支持多种设备,如手持设备 iPhone/iPad.平板等 免费使用 - 开源免费 轻量 ...