POJ2653判断线段相交
题目大意:按顺序放木棒,问最后所有的木棒中上面没有木棒的木棒的索引是……
思路:按理说线段相交的题目做的听多了,这个应该不算新鲜,但是这个题,还是让我学到了认真读题,面对这个题很容易想到对于新输入的一根木棒,遍历它前面所有的木棒,判断是否有重合的有的话,把那个被重合木棒的索引标记好,这样是很好的但是两层循环就差不多是1e5 * (1 ~ 1e5)的复杂度了,所以看题看题:题目说,最后符合要求的木棒m < 1e3 ,就代表我们第二个循环可以是(1~ 1e3)的操作(前提,数据不算太暴力),所以,我们就可以记录索引,如果发现一个木棒已经作废,那我们就可以代替它,把新的木棒加到它的位置~~
code~~
正常的准备
#include <iostream>
#include <algorithm>
#include <vector>
#define eps 1e-10
using namespace std;
const int maxn = 1e5 + 1e2;
const int maxm = 1e3 + 1e2; struct Point
{
double x,y;
Point(double x = 0.0,double y = 0.0):x(x),y(y){} Point operator - (Point p){return Point(x - p.x,y - p.y);}
};
struct segment
{
Point p1,p2; segment (Point p1 = Point(0.0,0.0),Point p2 = Point(0.0,0.0)):p1(p1),p2(p2){}
}lset[maxn];
double cross(Point p0,Point p1,Point p2)
{
Point a = p1 - p0;
Point b = p2 - p0;
return a.x * b.y - b.x * a.y;
}
vector<int> ans;
线段相交的判断
bool interset(segment s1,segment s2)
{
int flag = 0;
if(cross(s1.p1,s1.p2,s2.p1) * cross(s1.p1,s1.p2,s2.p2) < eps)flag++;
if(cross(s2.p1,s2.p2,s1.p1) * cross(s2.p1,s2.p2,s1.p2) < eps)flag++;
if(flag == 2)return true;
return false;
}
main函数
int main()
{
int n;
double x1,y1,x2,y2;
while(~scanf("%d",&n),n)
{
ans.clear();
for(int i = 1;i <= n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
lset[i] = segment(Point(x1,y1),Point(x2,y2));
int idx = -1;
for(int j = 0;j < ans.size();j++)
{
if(ans[j] == -1)idx = j;
else if(interset(lset[i],lset[ans[j]]))ans[j] = -1;
}
if(idx != -1)ans[idx] = i;
else ans.push_back(i);
}
sort(ans.begin(),ans.end());
printf("Top sticks: ");
for(int i = 0;i < ans.size() - 1;i++)
{
if(ans[i] != -1)printf("%d, ",ans[i]);
}
printf("%d.\n", ans[ans.size() - 1]);
}
return 0;
}
idx就是待寻找的索引,初始化为-1也就是一个flag标志,不是-1代表有可替代的木棒,最后需要费时间排序一下
越来越喜欢模块化编程了,特别是自己打出来的代码,不整齐,不模块化,反而很不舒服,以前我还是一main到底,这就是进步吧,加油~
POJ2653判断线段相交的更多相关文章
- POJ2653 Pick-up sticks 判断线段相交
POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...
- POJ 2653 Pick-up sticks(判断线段相交)
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 7699 Accepted: 2843 De ...
- 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)
传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...
- 【POJ 2653】Pick-up sticks 判断线段相交
一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- hdu 1086(判断线段相交)
传送门:You can Solve a Geometry Problem too 题意:给n条线段,判断相交的点数. 分析:判断线段相交模板题,快速排斥实验原理就是每条线段代表的向量和该线段的一个端点 ...
- POJ_1066_Treasure Hunt_判断线段相交
POJ_1066_Treasure Hunt_判断线段相交 Description Archeologists from the Antiquities and Curios Museum (ACM) ...
- POJ_2653_Pick-up sticks_判断线段相交
POJ_2653_Pick-up sticks_判断线段相交 Description Stan has n sticks of various length. He throws them one a ...
- POJ_1556_The Doors_判断线段相交+最短路
POJ_1556_The Doors_判断线段相交+最短路 Description You are to find the length of the shortest path through a ...
随机推荐
- SQL Server:查看数据库用户权限(SQL 2005)
1. 查看 SQL 2005 用户所属数据库角色 use yourdb go select DbRole = g.name, MemberName = u.name, MemberSID = u.si ...
- [Fiddler] The connection to 'xxxxx.com' failed. <br />System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https> HTTPS handshake to intelte
最近利用模拟发get请求的时候出现: [Fiddler] The connection to ‘xxxxx.com' failed. <br />System.Security.Secur ...
- java基础六 [异常处理](阅读Head First Java记录)
在程序运行时,我们不能保证所有服务和方法都是正确的,如果发生问题报错会导致程序崩溃,所以需要对一些可以预见的错误进行异常处理,通过throw去抛出一个异常,然后用try..catch..将要执行的该方 ...
- VB 共享软件防破解设计技术初探(二)
VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...
- 使用HttpModule实现网址重写
1. 修改配置文件: <httpModules> <</span>add name="html" type="HttpModule&quo ...
- python单线程下实现多个socket并发
先看服务端的代码 import sys # import socket import time import gevent from gevent import socket from gevent ...
- vmware搭建vSAN提示磁盘不合格或者看不到磁盘的解决办法
1.如果磁盘不合格,或者在创建磁盘组的时候看不到该磁盘,一般的原因都是该磁盘有其他分区,可以使用下面的方法来解决 a.首先开启esxi主机的ssh功能 b.登陆到esxi的后台 c. ls /dev/ ...
- php libevent 详解与使用
libevent是一个基于事件驱动的高性能网络库.支持多种 I/O 多路复用技术, epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O,定时器和信号等事件: ...
- SQL Cursor 基本用法[用两次FETCH NEXT FROM INTO语句?]
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...
- 用递归方法求 n!
#include <iostream> using namespace std; #define LL long long LL fac(int n) { LL f; || n == ) ...