zoj 2102 - Tables

题目:给你一根木棒的两个端点坐标,以及一些高度相同的圆形桌子的圆心和半径,判断木棒状态。

分析:计算几何。如果木棒不掉下来有两种情况:1.重心在桌子上;2.重心两边各有点在桌子上;

分两种情况计算即可;

1. 重心在桌子上,只要判断木棒中心O是否在桌子表示的圆内即可;

2.判断重心两端,将木棒从中间分开,分别判断与圆相交与否即可;

相交判断,首先判断两点是否都在垂线的同侧:

在同侧则最近距离在端点;否则为点到直线距离,可以利用|ABxAC/AC|求得。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

typedef struct pnode
{
	double x,y,r;
	pnode(){}
	pnode(double X, double Y, double R = 0) {
		x = X;y = Y;r = R;
	}
}point;
point C[10001];

typedef struct lnode
{
	double x,y,dx,dy;
	lnode(){}
	lnode(double X, double Y, double DX, double DY) {
		x = X;y = Y;dx = DX;dy = DY;
	}
}line;

double dist_p2p(point a, point b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double crossproduct(point a, point b, point c)
{
	return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}

double dist_p2l(point p, point a, point b)
{
	line l(p.x, p.y, a.y-b.y, b.x-a.x);
	if ((l.dx*(a.y-l.y)-l.dy*(a.x-l.x))*(l.dx*(b.y-l.y)-l.dy*(b.x-l.x)) >= 0)
		return min(dist_p2p(p, a), dist_p2p(p, b));
	return fabs(crossproduct(a, b, p)/dist_p2p(a, b));
}

int main()
{
	point 	A,B,O;
	int 	n,a,b,c;
	while (~scanf("%d",&n) && n) {
		for (int i = 0; i < n; ++ i)
			scanf("%lf%lf%lf",&C[i].x,&C[i].y,&C[i].r);
		scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);

		point O((A.x+B.x)/2, (A.y+B.y)/2);
		a = b = c = 0;
		for (int i = 0; i < n; ++ i) {
			if (dist_p2p(C[i], O) <= C[i].r)
				c = 1;
			if (dist_p2l(C[i], O, A) <= C[i].r)
				a = 1;
			if (dist_p2l(C[i], O, B) <= C[i].r)
				b = 1;
		}

		if (c || a&&b)
			printf("STAY\n");
		else printf("FALL\n");
	}
    return 0;
}
时间: 2024-10-25 18:27:36

zoj 2102 - Tables的相关文章

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我看了oibh上的解题报告后做 的,所以就不写了…… 题目排列顺序没有规律……:( 按照个人感觉,最短路有的算做了DP,有的算做了图论. 有些比较

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

Replicate Partitioned Tables and Indexes

在初始化subscriber时,Replication能够将分区table 和 分区index的Partition function 和 Partition schema 复制到 subscriber中,这样,table 和 Index 以相同的Partition schema创建.但是,replication 不会将 Partition function 和 Partition schema的更新同步到subscriber,即只在初始subscriber时,复制一次 Partition fun

mysql启动报错:Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

mysql在首次启动的时候可能会报错:Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 这时候可以执行脚本 mysql_install_db –user=mysql –ldata=数据存放的路径

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

uva 1385 - Billing Tables(字典树)

题目链接:uva 1385 - Billing Tables 题目大意:给定n个电话前缀,每个前缀是一个区域的前缀,现在要生成一个新的电话单,即对于每个电话号码,从旧的电话单上从前向后遍历,如果出现前缀匹配,则该电话号码对应的即为当前的区号,要求生成的新电话单尽量小. 解题思路:用dfs建立字典树,在区间范围内的点对应均为对应的区号,注意如果70.71.72....79都为SB的话,那么可以合并成7,并且对应区号为SB. 注意合并的条件为区号相同即可,并不是说对应旧电话单匹配位置相同. 注意这组