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判断线段相交的更多相关文章

  1. POJ2653 Pick-up sticks 判断线段相交

    POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...

  2. POJ 2653 Pick-up sticks(判断线段相交)

    Pick-up sticks Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 7699   Accepted: 2843 De ...

  3. 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)

    传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...

  4. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  5. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  6. hdu 1086(判断线段相交)

    传送门:You can Solve a Geometry Problem too 题意:给n条线段,判断相交的点数. 分析:判断线段相交模板题,快速排斥实验原理就是每条线段代表的向量和该线段的一个端点 ...

  7. POJ_1066_Treasure Hunt_判断线段相交

    POJ_1066_Treasure Hunt_判断线段相交 Description Archeologists from the Antiquities and Curios Museum (ACM) ...

  8. POJ_2653_Pick-up sticks_判断线段相交

    POJ_2653_Pick-up sticks_判断线段相交 Description Stan has n sticks of various length. He throws them one a ...

  9. POJ_1556_The Doors_判断线段相交+最短路

    POJ_1556_The Doors_判断线段相交+最短路 Description You are to find the length of the shortest path through a ...

随机推荐

  1. SQL Server:查看数据库用户权限(SQL 2005)

    1. 查看 SQL 2005 用户所属数据库角色 use yourdb go select DbRole = g.name, MemberName = u.name, MemberSID = u.si ...

  2. [Fiddler] The connection to 'xxxxx.com' failed. <br />System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https&gt; HTTPS handshake to intelte

    最近利用模拟发get请求的时候出现: [Fiddler] The connection to ‘xxxxx.com' failed. <br />System.Security.Secur ...

  3. java基础六 [异常处理](阅读Head First Java记录)

    在程序运行时,我们不能保证所有服务和方法都是正确的,如果发生问题报错会导致程序崩溃,所以需要对一些可以预见的错误进行异常处理,通过throw去抛出一个异常,然后用try..catch..将要执行的该方 ...

  4. VB 共享软件防破解设计技术初探(二)

    VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...

  5. 使用HttpModule实现网址重写

    1.  修改配置文件: <httpModules> <</span>add name="html" type="HttpModule&quo ...

  6. python单线程下实现多个socket并发

    先看服务端的代码 import sys # import socket import time import gevent from gevent import socket from gevent ...

  7. vmware搭建vSAN提示磁盘不合格或者看不到磁盘的解决办法

    1.如果磁盘不合格,或者在创建磁盘组的时候看不到该磁盘,一般的原因都是该磁盘有其他分区,可以使用下面的方法来解决 a.首先开启esxi主机的ssh功能 b.登陆到esxi的后台 c. ls /dev/ ...

  8. php libevent 详解与使用

    libevent是一个基于事件驱动的高性能网络库.支持多种 I/O 多路复用技术, epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O,定时器和信号等事件: ...

  9. SQL Cursor 基本用法[用两次FETCH NEXT FROM INTO语句?]

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  10. 用递归方法求 n!

    #include <iostream> using namespace std; #define LL long long LL fac(int n) { LL f; || n == ) ...