POJ - 4048 Chinese Repeating Crossbow 暴力枚举+线段香蕉?
题目链接:点击查看
题意:从一给出的点出发可以向任意方向发出射线,然后现在平面上共有1500条线段,问最多能使射线和几条线段相交
题解:每个线段都有一个对应的角度范围,刚开始想的是离散化一下,求一下哪个范围包括的最多,但是对应的范围是一个360度的圈,没法操作,然后注意到了数据只有1500,这样就可以暴力所有的端点,枚举每一条线段判断是否相交即可,射线我们可以抽象成线段,先判断射线的方向,然后把另一端点x设成10000,或-10000 ,y坐标相似求一下即可
两线段相交模板:点击查看,用过好几次了,挺好用的,可以保存一下。
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=50010;
struct node{int x1,y1,x2,y2;
}aa[1100];
struct node1{int x,y;
}p[2100];
struct Point{double x,y;
};
int n,len;
int xx,yy;
map<int,map<int,int> > mp;
bool judge(int i,int j)
{Point a,b,c,d;a.x=xx;a.y=yy;if(p[i].x==xx){b.x=p[i].x;if(p[i].y>yy) b.y=10000;else b.y=-10000;}else if(p[i].x>xx){b.x=10000;b.y=(double)(10000.0-xx)/(p[i].x-xx)*(p[i].y-yy)+yy;}else{b.x=-10000;b.y=(double)(xx+10000)/(xx-p[i].x)*(p[i].y-yy)+yy;}c.x=aa[j].x1;c.y=aa[j].y1;d.x=aa[j].x2;d.y=aa[j].y2;if(!(min(a.x,b.x)<=max(c.x,d.x) && min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x) && min(a.y,b.y)<=max(c.y,d.y)))return false;double u,v,w,z;u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);return (u*v<=0.00000001 && w*z<=0.00000001);
}
int main()
{int T;int x,y;scanf("%d",&T);while(T--){len=0;mp.clear();scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d%d",&aa[i].x1,&aa[i].y1,&aa[i].x2,&aa[i].y2);if(!mp[aa[i].x1][aa[i].y1]){mp[aa[i].x1][aa[i].y1]=1;p[++len].x=aa[i].x1;p[len].y=aa[i].y1;}if(!mp[aa[i].x2][aa[i].y2]){mp[aa[i].x2][aa[i].y2]=1;p[++len].x=aa[i].x2;p[len].y=aa[i].y2;}}scanf("%d%d",&xx,&yy);int ans=0;for(int i=1;i<=len;i++){int cnt=0;for(int j=1;j<=n;j++)if(judge(i,j))cnt++;ans=max(cnt,ans);}printf("%d\n",ans);}return 0;
}
POJ - 4048 Chinese Repeating Crossbow 暴力枚举+线段香蕉?相关推荐
- 暴力枚举(字符串匹配)-Blue Jeans POJ - 3080
暴力枚举(字符串匹配)-Blue Jeans POJ - 3080 题目: Genographic项目是IBM与国家地理学会之间的研究合作伙伴关系,该合作伙伴正在分析数十万贡献者的DNA,以绘制地球的 ...
- POJ 3174 暴力枚举
思路: 暴力枚举三个点 判一判 搞定 (x1*y1=x2*y2) x1.y1.x2.y2为他们两两的差 //By SiriusRen #include <cstdio> using nam ...
- 【POJ - 2965】The Pilots Brothers' refrigerator(暴力枚举,思维)
题干: The game "The Pilots Brothers: following the stripy elephant" has a quest where a play ...
- codeforces数学1600day6[CodeForces - 1029C多区间交+枚举,CodeForces 992C[数学公式推导],CodeForces 992B[质因数分解+暴力枚举]]
A - Maximal Intersection CodeForces - 1029C 题目大意:就是给你n个区间,这n个区间有公共的区间长度为x,现在叫你从这n个区间中删掉一个使得x最大化. 解题思 ...
- POJ 2429 GCD LCM Inverse ★(pollard-ρ DFS枚举)
题目链接:http://poj.org/problem?id=2429 题目大意:给定gcd(a,b)和lcm(a,b)(<2^63),求a和b,如果有多种情况,输出和最小的情况. 首先gc ...
- 最大字段和 冲出暴力枚举
这篇解题报告是对我最近一些题的总结,里面的代码都是我解题,优化,再优化的过程的记录,记录了自己对算法的完善与优化思路,还有对编程哲学的理解:do it,do it well. 很感谢孙老师您,让自己可 ...
- hdu 4587 TWO NODES 暴力枚举+tarjan
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意是拿掉两个点 求最多可以把整个图分成几个联通块 注意到有一个模板是可以通过找割点来快速求出 ...
- 一道暴力枚举题Win32版本示例
来看一个问题:该问题的解法是 暴力枚举:这大概是ACM方面的:名称叫火柴棒等式: 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数( ...
- C. Divisibility by Eight【暴力枚举】
暴力枚举即可.枚举1位这种情况,枚举2位这种情况,枚举3位这种情况. 3位满足足以,其他的4位,5位...都包含1000必定满足. #include<bits/stdc++.h> usin ...
最新文章
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
- java窗体添加背景图片_Java项目实战之实战之天天酷跑(四):游戏主界面
- hikaridatasource 加密后登陆不上_渗透测试 | 突破前端JS加密限制
- 靠加班?靠团建?靠个人?请停止无效努力!
- python 类变量和实例变量
- linux 修改文件可执行,linux下用chmod修改文件为可执行文件
- Swift学习几天就会写项目
- redis 下载安装 python 操作redis django 连接redis
- Orcad Pspice仿真
- SIM868模块+Arduino将位置信息上传到服务器
- Echarts实现柱状图下钻功能
- 数据可视化设计作品,有时候更直击人心!
- 美团点评女技术总监任登君:不要给自己的人生设限
- ACM素数打表(模版)
- QtQuick串口编程Demo
- confluence工具
- MacBook苹果电脑在充电中无法指纹解锁解决办法
- 【精髓】Laravel 模型关联
- 数据结构第二章(单链表部分)学习笔记
- [Python]不使用kociemba库解魔方