题目来源:https://biancheng.love/contest-ng/index.html#/41/problems

捡火柴的Nova君

题目描述

南方没暖气,怕冷的的宝宝们只能用火柴取暖。然而Nova君害怕火烧到手指头,当木头梗还有一大截的时候就慌忙把火柴丢到地上踩灭了,没多久,地上就七零八落,躺着一堆木棍,有得木梗还盖在了别的上面。现在Nova君打算收拾残局,他准备一根一根捡起火柴,但他很怕多花力气,所以决定优先捡起没有被盖住的火柴梗(因为被盖住的捡起来更费力嘛),所以现在Nova君,有多少根火柴是没有被盖住的呢?

输入

多组测试数据(组数不超过100),对于每组数据,第一行为一个正整数N,表示火柴梗的根数,接下来N行,每行四个浮点数a1,a2,b1,b2,分别表示火柴梗两个端点的横纵坐标。(请用double数据类型,保证输入数据合法)

输出

对于每组数据,输出一行,表示没有被盖住的火柴序号(输出的相对顺序与输入时保持一致)

输入样例

2
1 1 2 2
1 1 3 3
3
0 0 1 1
1 0 2 1
2 0 3 1

输出样例

2
1 2 3

Hint

抽象出的线段,只要有点重合,就算是覆盖了

解题思路:
一根火柴两个端点,两个端点组成一个线段。意思就是找到没有被覆盖的火柴序号。
注意:火柴序号即火柴输入的顺序(1,2,3。。。)
姿势很多,给出结构体代码:
 #include <bits/stdc++.h>
#define eps 1e-6
#define MAX 100010 using namespace std; int sgn(double x)
{
if(fabs(x)<eps)
return ;
if(x<)
return -;
else return ;
} struct Point
{
double x,y;
Point() {}
Point(double x1,double y1)
{
x=x1;
y=y1;
}
Point operator -(Point b)
{
return Point(x-b.x,y-b.y);
}
double operator ^(const Point b)
{
return x*b.y-y*b.x;
}
double operator *(Point b)
{
return x*b.x+y*b.y;
}
}; struct Line
{
Point start,over;
Line() {}
Line(Point start1,Point over1)
{
start=start1;
over=over1;
}
}; bool cs(Line l1,Line l2)
{
return
( max(l1.start.x,l1.over.x)>=min(l2.start.x,l2.over.x)
&&max(l2.start.x,l2.over.x)>=min(l1.start.x,l1.over.x)
&&max(l1.start.y,l1.over.y)>=min(l2.start.y,l2.over.y)
&&max(l2.start.y,l2.over.y)>=min(l1.start.y,l1.over.y)
&&sgn((l2.start-l1.start)^(l1.over-l1.start))*sgn((l2.over-l1.start)^(l1.over-l1.start))<=
&&sgn((l1.start-l2.start)^(l2.over-l2.start))*sgn((l1.over-l2.start)^(l2.over-l2.start))<= );
} Line line[MAX];
bool flag[MAX];
int main()
{
int n,i,j;
double x1,y1,x2,y2;
while(~scanf("%d",&n))
{
for(i=;i<=n;i++)
{
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
line[i]=Line(Point(x1,y1),Point(x2,y2));
flag[i]=true;
}
for(i=;i<=n;i++)
{
for(j=i+;j<=n;j++)
if(cs(line[i],line[j]))
{
flag[i]=false;
break;
}
}
for(i=;i<=n;i++)
{
if(flag[i])
{
printf("%d ",i);
}
}
printf("\n");
}
return ;
}


捡火柴的Nova君(n个线段相交问题)的更多相关文章

  1. 忙碌的Nova君 (活动安排问题、贪心算法)

    题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设 ...

  2. HDU 3492 (直线与所有线段相交) Segment

    题意: 给出n个线段,判断是否存在一条直线使得所有线段在直线上的射影的交非空. 分析: 如果我们找到一条与所有线段相交的直线,然后做一条与该直线垂直的直线,这些线段在直线上的射影就一定包含这个垂足. ...

  3. poj1127 Jack Straws(线段相交+并查集)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Jack Straws Time Limit: 1000MS   Memory L ...

  4. POJ 1066 Treasure Hunt (线段相交)

    题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...

  5. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  6. HDU1086You can Solve a Geometry Problem too(判断线段相交)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  7. POJ 2653 Pick-up sticks【线段相交】

    题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...

  8. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

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

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

随机推荐

  1. Transact-SQL 示例 - UPDATE中使用INNER JOIN

    一般情况下博主已经对在SELECT语句当中使用INNER JOIN非常娴熟,但在UPDATE当中使用INNER JOIN的场景就为数不多了.以下博主将为你介绍在UPDATE场景当中使用INNER JO ...

  2. 把一个对象转化为xml

    方法一:指定对象 private string ToGatheringEMXML(GatheringEMEntity entity) { string retSerialXml = "&qu ...

  3. Nightwatch.js – 轻松实现浏览器的自动测试

    Nightwatch.js 是一个易于使用的,基于 Node.js 平台的浏览器自动化测试解决方案.它使用强大的 Selenium WebDriver API 来在 DOM 元素上执行命令和断言. 语 ...

  4. Java 常用字符串操作总结

    1. String转ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuf ...

  5. .Net魔法堂:log4net详解

    一.作用 提供一个记录日志的框架,可以将日志信息记录到文件.控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 二.先看看示例,感受一下吧   c ...

  6. 安装 Oracle P6 EPPM 16 R1 database for 12C A

  7. ASP.NET后台执行JS代码

    1. 用Response.Write方法 代码如下:Response.Write("<script type='text/javascript'>alert("XXX& ...

  8. SignalR简单示例教程入门版

    上周五最后一天在公司上班,无聊之余就想做点什么.介于之前有人让我做个简易版的在线聊天的,于是乎就打算花一天时间来弄下关于SignalR的简单教程制作一个在线的聊天的. 1:前端用了国产的一个MVVM框 ...

  9. Sql server脏读、更新丢失、不可重复读、幻象读问题及解决方案

    1.脏读:一个事务读到另外一个事务还没有提交的数据.解决方法:把事务隔离级别调整到READ COMMITTED,即SET TRAN ISOLATION LEVEL READ COMMITTED.这时我 ...

  10. 重新想象 Windows 8 Store Apps (61) - 通信: http, oauth

    [源码下载] 重新想象 Windows 8 Store Apps (61) - 通信: http, oauth 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通信 ...