• 全部
  • 问答

uva 比赛的E 题目?

jwd_1_cool 2003-07-29 10:21:05
请问通过的朋友, 那道题目 oibh 上说用 离散化+区间扫描 ?什么意思?
端点相连 算吗??
例:
input:
0 1 10 1
0 2 -10 2
0 0

那么 output: 应该是什么啊?

我竟然W/A了好几次?
还有为什么UVA 的contest那么容易TLE啊?
...全文
10 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jwd_1_cool 2003-08-01
ok!
回复
jwd_1_cool 2003-08-01
哦,你那个数据好象我的程序也是可以通过的啊!
2
回复
standlove 2003-08-01


就是把每条线段转换成 两个弧度值~
然后把 弧度看成是 线段的两端点, 做一个线扫除法就可以了~
回复
jwd_1_cool 2003-08-01
我做题太粗了! lymgf(自封五星★★★★★) 你说的方法应该可行,但也更麻烦了
starfish 给出的想法:

做一个大园,以原点为圆心,半径尽量的大,使得他能包含所有的线段。
然后把每条线段投影到这个大圆的圆周上,
具体方法是,对于线段PQ,连接OP,延长线交圆周于P',
连接OQ,延长线交圆周于Q'
弧P'Q'就是PQ在圆周上的投影
可以假想原点有一个电灯
弧P'Q'就是PQ在圆周上的阴影。

这样就把所有的线段都放到同一个大圆上了
如果一条射线穿过PQ,一定也会穿过PQ的投影弧P'Q'
因此
原问题就变为了
在大圆上,有很多段弧,要求某一点上重叠最多的弧的数目
这类似于给一条直线,有一些线段覆盖在上面
求哪一点上覆盖的线段数目最多。
只需要把圆弧断开,拉成直线
原问题就转化为了求线段覆盖数目的问题了。

而这个覆盖数目只需一次扫描就可以搞定,这就不用我说了吧?
算法复杂度是O(n)
------------------------------------------------------------

但我同样不知道如何实现?细节!
回复
cygandti 2003-07-31
up
回复
lymgf 2003-07-31
知道你的问题所在了,测试这个数据:
shooter: 0 0
wall1: -1 1 1 1
wall2: -2 2 2 2

你的intersect判断是有问题的。

我的想法:
1、给每个线段的端点赋一个计数值,初始为0,并求出每个线段的区间。
2、对每个区间,测试端点是否在区间内,若是,该端点计数加1。
3、最大计数值即为解
回复
lymgf 2003-07-31
If the laser ray touches any wall or intersects it, that wall will be destroyed and the ray will advance ahead

-------------------------------------------------------------------------------
由这句话可以判断,端点也算
回复
jwd_1_cool 2003-07-31
不知道这里有没有OIBH的朋友,提供一下比赛的测试数据.
回复
lymgf 2003-07-31
看了题目,应该是求站点到线段端点联线的角度,获得一个角度区间,laser的发射角度处于区间内,就可以击毁这道墙。如果两道墙的区间有重叠部分,就可以用一道laser同时击毁。这题就是求有重叠区间的最大线段数。

至于端点算不算,多提交一次就可以知道

看了你的代码,好像方法也可以,就是实现的麻烦了点。
回复
jwd_1_cool 2003-07-30
代码:
#include<iostream.h>
#include<string.h>

class point{
public:
point(){}
point(int a,int b):x(a),y(b){}
int x,y;
};
class segment{
public:
segment(){}
segment(point a,point b):p1(a),p2(b){}
point p1,p2;
};

segment ss[500];
int n;
int sameside(point p1,point p2,segment s)
{
int a,b;
a=((p1.x-s.p1.x)*(s.p2.y-s.p1.y)-(p1.y-s.p1.y)*(s.p2.x-s.p1.x));
b=((p2.x-s.p1.x)*(s.p2.y-s.p1.y)-(p2.y-s.p1.y)*(s.p2.x-s.p1.x));
return a*b;
}
bool intersect(segment s1,segment s2) //端点也算相交
{
int sameside1,sameside2;
sameside1=sameside(s2.p1,s2.p2,s1);
sameside2=sameside(s1.p1,s1.p2,s2);
if(sameside1>0||sameside2>0) return false;
if(sameside1+sameside2<=0) return true;
}
int check(segment s)
{
int ret(0);
for(int i=0;i<n;i++)
if(intersect(s,ss[i]))
ret++;
return ret;
}

int main()
{
while(cin>>n){
int x1,x2,y1,y2;
for(int i=0;i<n;i++){
cin>>x1>>y1>>x2>>y2;
point p1(x1,y1),p2(x2,y2);
segment s(p1,p2);
ss[i]=s;
}
cin>>x1>>y1;
int sum(0);
point p(x1,y1);
for(int i=0;i<n;i++){
segment s1(p,ss[i].p1),s2(p,ss[i].p2);
int t1=check(s1);
int t2=check(s2);
int t=t1>t2?t1:t2;
if(t>sum)sum=t;
}
cout<<sum<<endl;
}
return 1;
}
回复
jwd_1_cool 2003-07-30
The shooter is in a great problem. He is trapped in a 2D maze with a laser gun and can use it once. The gun is very powerful and the laser ray, it emanates can traverse infinite distance in its direction. In the maze the targets are some walls (Here this is line segments). If the laser ray touches any wall or intersects it, that wall will be destroyed and the ray will advance ahead. The shooter wants to know the maximum number of walls, he can destroy with a single shot. The shooter will never stand on a wall.



Input

The input file contains 100 sets which needs to be processed. The description of each set is given below:



Each set starts with a postive integer, N(1<=N<=500) the number of walls. In next few lines there will be 4*N integers indicating two endpoints of a wall in cartesian co-ordinate system. Next line will contain (x, y) the coordinates of the shooter. All coordinates will be in the range [-10000,10000].



Input is terminated by a case where N=0. This case should not be processed.



Output
For each set of input print the maximum number of walls, he can destroy by a single shot with his gun in a single line.



Sample Input Output for Sample Input
3 3
0 0 10 0 2
0 1 10 1
0 2 10 2
0 -1
3
0 0 10 0
0 1 10 1
0 3 10 3
0 2
0
--------------------------------------------------------------------------------
回复
lymgf 2003-07-29
题目&代码能贴出来吗?
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2003-07-29 10:21
社区公告
暂无公告