Pick-up sticks POJ - 2653
题目链接:POJ - 2653
首先这题数据n<100000可能没错,但只要边添加,边判断弹出的话,还是可以直接用双for来判断。
1.边判断弹出怎么实现?
链表似乎是很不错的,从前往后遍历,不行的O(1)弹出,但不管是手写指针链表,stl链表,还是数组链表都麻烦些(还是不太会QAQ)。可以用两个队列来实现,每次弹空一个,判断是否压入另一个,注意下最后输出答案是从小到大的
2.判断线段相交呢?
先判断是否平行
重合的话返回YES,平行的话返回NO
不平行的话
当做判断直线和线段相交,只不过判定两遍,两个线段分别做一次直线和线段,如果两次直线和线段都相交返回YES(这个方法这题是没问题,仔细想想好像没什么问题,甚至上面的平行都不用判断)
否则返回NO
代码
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<utility>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
#define fo(a,b) for(int i=a;i<=b;i++)
#define inf 0x3f3f3f3f
#define ll long long
#define dou double
#define EXP 1e-6
#define M 1000005
int n;
struct P{double x,y;P(double x=0,double y=0):x(x),y(y){}
};
struct L{P a,b;int id;L(){}L(P a,P b):a(a),b(b){}
}cnt;
queue<L>q[2];
double area(P a,P b,P c){return fabs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))/2;
}
bool par(L a,L b){ //判断线段是否平行(重合和平行)return fabs((a.b.x-a.a.x)*(b.b.y-b.a.y)-(b.b.x-b.a.x)*(a.b.y-a.a.y))<EXP;
}
dou cross(P mark,P a,P b){ //在向量a->b的左边return (a.x-mark.x)*(b.y-mark.y)-(b.x-mark.x)*(a.y-mark.y);
}
int inte(L x,P a,P b)
{return cross(a,x.a,x.b)*cross(b,x.a,x.b)<EXP;
}
int f(L x,L y){if(par(x,y)){ //平行if(area(y.a,x.a,x.b)>EXP) return 1; //平行return 0; //重合}return !(inte(x,y.a,y.b)&&inte(y,x.a,x.b));
}
void add(L x,int d){while(!q[d%2].empty()){if(f(q[d%2].front(),x)) q[(d+1)%2].push(q[d%2].front());q[d%2].pop();}q[(d+1)%2].push(x);
}
int main(){while(cin>>n&&n){fo(1,n){cin>>cnt.a.x>>cnt.a.y>>cnt.b.x>>cnt.b.y;cnt.id=i;add(cnt,i);}printf("Top sticks:");int now=(n+1)%2;while(!q[now].empty()){printf(" %d%c",q[now].front().id,q[now].size()==1?'.':',');q[now].pop();}printf("\n");}return 0;
}
Pick-up sticks POJ - 2653相关推荐
- 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)
一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...
- POJ 2653 线段交
思路: 运用队列存储没有被覆盖的木棍,没加入一个棍子,就要判断一下是否队列中的棍子被覆盖,如果被覆盖,就从队列中删除: 线段交判断方法:跨立实验 Pick-up sticks Time Limit: ...
- 判断线段相交 + vector. erase迭代指针 的使用 poj 2653 Pick-up sticks
题目来源:http://poj.org/problem?id=2653 分析: 题意:按顺序给出一些木棍,输出在最上面的木棍标号. 用vector 存储木棍标号, 当前木棍与 vector 中的木棍 ...
- POJ 2653 Pick-up sticks (线段相交)
题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...
- POJ 2653 Pick-up sticks 判断线段相交
枚举每条线段 这条线段上面没有与它相交的线段 #include <iostream> #include <cstdio> #include <cstring> #i ...
- poj 2653 Pick-up sticks(判断线段相交)
题意:在桌上一次放n根木棒,求最上面的木棒编号: 思路:暴力枚举,看每根木棒上是否有木棒: 技巧:使用叉积,判断一个向量的两端点是否在另一向量的同侧,从而判断相交: #include<cstdi ...
- Wooden Sticks POJ - 1065(最大上升子序列+动态规划状态转移思维)
题意: 给你n个木棍的长度和重量,让其成为上升序列,如果不能达到,就需要重新一分钟设置. a)第一个木棍的准备时间为1分钟. b)在处理长度为l和重量为w的棒之后,如果l <= l'并且w &l ...
- DP(01背包) UESTC 1218 Pick The Sticks (15CCPC C)
题目传送门 题意:长度为L的金条,将n根金棍尽可能放上去,要求重心在L上,使得价值最大,最多有两条可以长度折半的放上去. 分析:首先长度可能为奇数,先*2.然后除了两条特殊的金棍就是01背包,所以dp ...
- uestc oj 1218 Pick The Sticks (01背包变形)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
最新文章
- Notepad++使用技法
- Python3 环境搭建、pycharm安装配置详解、新建Python项目(新手小白版Windows系统)
- java程序启动后就进行了7次younggc_程序员如何优化 Java GC
- UVA 12716 GCD XOR(数论+枚举+打表)
- JvavScript中的函数与对象
- 关于计算机学科的一些期刊和会议(转)
- docker强制删除none的image镜像
- 一个页面中,不同子页面见高度不受影响的布局
- 使用CrossOver的Wine配置修改容器WIndows系统版本
- itextsharp创建pdf
- python-mysql-excel-正则表达式,综合使用
- 如何在 Mac 上使用“活动监视器”
- filezilla linux 乱码,解决FileZilla Server搭建FTP中文乱码问题
- FSViewer 一款功能强大的看图软件
- 用php制作一个简单的网页留言板
- python降低图片分辨率_Python批量更改图片分辨率
- HTML网页设计制作大作业(div+css) ~ 中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)
- arduino电风扇程序_【NO.7】智能风扇控制器-
- Java证书读取的两种方式
- 7-13 寻找大富翁 (25分)
热门文章
- 计算机专业相关认证证书含金量对比
- catia里画铰链_基于CATIA的汽车门铰链三维造型设计
- JAVA编译报错:A JNI error has occurred, please check your installation and try again
- 管家婆之垃圾清理功能
- [附源码]java毕业设计剧本杀门店管理系统-
- ASEMI-A7二极管和M7二极管有什么区别
- 被腾讯抄袭致死的公司有哪些? 网友留言: 无爆款不抄袭的腾讯!
- Shopee印尼本土多店铺运营管理首选工具——Shopee Man
- 互联网大厂java面试题一京东
- Thinkpad预装office 2019激活