POJ 2653
题目大意:一个小孩不断往地上扔棍子,共n根,求结束后共有多少根不与去他相交。
解法思路:典型的判断线段相交问题,利用快速排斥+双跨立判断相交,最后输出没相交的。
(图片来源:http://www.2cto.com/kf/201308/237246.html)
#include<iostream>
#include<algorithm>
using namespace std;
const int nMax = ;
const int mMax = ;
struct Point
{
double x, y;
}s[nMax], e[nMax];
double mult(Point sp, Point ep, Point op) //叉积
{
return (sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y);
}
bool isInter(Point s1, Point e1, Point s2, Point e2)
{
if( min(s1.x, e1.x) <= max(s2.x, e2.x) &&
min(s1.y, e1.y) <= max(s2.y, e2.y) &&
min(s2.x, e2.x) <= max(s1.x, e1.x) &&
min(s2.y, e2.y) <= max(s1.y, e1.y) && //快速排斥
mult(s2, e2, s1) * mult(s2, e2, e1) <= && //双跨立
mult(s1, e1, s2) * mult(s1, e1, e2) <= )
return true;
return false;
}
int main()
{
int n , i ;
while(scanf("%d", &n) == && n != ) //每当输入一组数据成功
{
int ans[mMax] , m = ;
for(i = ; i <= n; i++)
{
scanf("%lf%lf%lf%lf", &s[i].x, &s[i].y, &e[i].x, &e[i].y);
int pos = -;
for(int j = ; j < m; j ++)
{
if(ans[j] == -)
pos = j;
else
if(isInter(s[i], e[i], s[ans[j]], e[ans[j]]))
ans[j] = -;
}
if(pos == -)
ans[m++] = i;
else
ans[pos] = i;
}
i = ;
sort(ans, ans + m); //升序排列,按照输入顺序
while(ans[i] == -)
i++;
printf("Top sticks:");
while(i < m-)
printf(" %d,", ans[i ++]);
printf(" %d.\n", ans[i]);
}
return ;
}
!!!!这个代码有点问题,但给的两组都过了,求大神指点.....
//这个代码有点问题,但给的两组都过了,求大神指点.....
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
double x,y;
}s,e;
struct side
{
node s,e;
int nth;
}temp;
inline int multy(const node &p0,const node &p1,const node &p2) //叉积
{
return ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
inline bool is_insert(const node &s1,const node &e1,const node &s2,const node &e2) //判交
{
if( min(s1.x, e1.x) <= max(s2.x, e2.x) &&
min(s1.y, e1.y) <= max(s2.y, e2.y) &&
min(s2.x, e2.x) <= max(s1.x, e1.x) &&
min(s2.y, e2.y) <= max(s1.y, e1.y) && //快速排斥
multy(s2, e2, s1) * multy(s2, e2, e1) <= && //双跨立
multy(s1, e1, s2) * multy(s1, e1, e2) <= )
return true;
return false;
}
inline bool cmp(const side &a,const side &b)
{
return (a.nth<b.nth);
}
int main()
{
int n;
while(scanf("%d",&n)==&&n)
{
vector<side>v;
for(int i=;i<n;i++)
{
scanf("%lf%lf%lf%lf",&s.x,&s.y,&e.x,&e.y);
bool f=true,first=true;
for(int j=;j<v.size();j++)
if(is_insert(s,e,v[j].s,v[j].e))
if(first)
v[j].s=s,v[j].e=e,v[j].nth=i,f=false,first=false; //第一次相交替换
else
v.erase(v.begin()+j); //第二次相交直接删
if(f)
{
temp.s=s,temp.e=e,temp.nth=i;
v.push_back(temp);
}
}
sort(v.begin(),v.end(),cmp); //按顺序输出
printf("Top sticks:");
for(int i=;i<v.size()-;i++)
printf(" %d,",v[i].nth+);
v[v.size()-].nth++;
printf(" %d.\n",v[v.size()-].nth); //注意格式
}
return ;
}
POJ 2653的更多相关文章
- 线段相交 POJ 2653
// 线段相交 POJ 2653 // 思路:数据比较水,据说n^2也可以过 // 我是每次枚举线段,和最上面的线段比较 // O(n*m) // #include <bits/stdc++.h ...
- poj 2653 线段与线段相交
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11884 Accepted: 4499 D ...
- poj 2653 (线段相交判断)
http://poj.org/problem?id=2653 Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submis ...
- POJ 2653 - Pick-up sticks - [枚举+判断线段相交]
题目链接:http://poj.org/problem?id=2653 Time Limit: 3000MS Memory Limit: 65536K Description Stan has n s ...
- POJ 2653 Pick-up sticks (线段相交)
题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...
- POJ 2653 Pick-up sticks【线段相交】
题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...
- 【POJ 2653】Pick-up sticks 判断线段相交
一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...
- poj 2653 线段相交
题意:一堆线段依次放在桌子上,上面的线段会压住下面的线段,求找出没被压住的线段. sol:从下向上找,如果发现上面的线段与下面的相交,说明被压住了.break掉 其实这是个n^2的算法,但是题目已经说 ...
- 计算几何--判断两条线段相交--poj 2653
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8862 Accepted: 3262 De ...
随机推荐
- JQuery,拼接字符串问题(求助)
Js代码 $("#span_btnSave").html(str1); 结果 <span id="span_btnSave"><button ...
- MHA+Atlas+mysql一主一从开启gtid安装配置与实验
各节点架构 (说明:生产环境有两个节点可以组成一套完整集群,我是测试环境,因此对于manager以及atlas和binlog server都是单点,如果生产环境,相应的将manager以及atlas和 ...
- spring MVC 资料
1.web.xmlorg.springframework.web.filter.CharacterEncodingFilter;配置字符编码,配置示例: <filter> <filt ...
- AutoHotkey(AHK)
这是2009年用过的一个软件,自动键盘执行的一个东西,能提高效率,代替人工击键和鼠标操作,现在中文化很好了,如下地址是中文文档 http://ahkcn.sourceforge.net/docs/Tu ...
- mongodb 使用场景和不使用场景
1.mongodb介绍 MongoDB (名称来自"humongous") 是一个可扩展的高性能,开源,模式自由,面向文档的数据库.它使用C++编写.MongoDB特点: a.面向 ...
- RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript
1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...
- 转: Hibernate commit() 和flush() 的区别
[java] view plaincopyprint? <<精通Hibernate java对象持久化技术详解>> ,flush()方法进行清理缓存的操作,执行一系列的SQL语 ...
- nginx 模块讲解
1. 通用配置选项: --prefix=<path> 指定Nginx的安装路径,所有其他的路径都要依赖于该选项 --sbin-path=<path> ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- 如何理解和熟练运用js中的call及apply?
改变this指向 要先明白存在call和apply的原因,才能记得牢一点: 在javascript OOP中,我们经常会这样定义: function cat(){ } cat.prototype={ ...