poj2194Stacking Cylinders

可以根据反余弦和反正切算出角a和b的值, 然后向量旋转就可以了,图中的状态旋转rotate((2,0),a+b) 反状态把角度反过来,点取(-2,0)即可。
不知道是不是理解错了,题意写着两圆距离》2,《3.4,在求得时候就加了特判,一直WA。。。去了特判就过了。
为了提高精度,可以全化为atan2.
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
const double r = 1.0;
const double rd = 3.40;
struct point
{
double x,y,r;
point(double x=,double y=):x(x),y(y){}
}p[N],q[N];
typedef point pointt;
pointt operator -(point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
double dis(point a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
double dot(point a,point b)
{
return a.x*b.x+a.y*b.y;
}
double angle(point a,point b)
{
return acos(dot(a,b)/dis(a)/dis(b));
}
double angle1(point v)
{
return atan2(v.y,v.x);
}
int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
}
point rotate(point a,double rad)//逆时针旋转
{
return point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
}
bool cmp(point a,point b)
{
return a.x<b.x;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)&&n)
{
for(i = ; i <= n;i++)
{
double x;
scanf("%lf",&x);
p[i] = point(x,);
}
sort(p+,p+n+,cmp);
int tn = n;
double maxz = ;
point tp;
while()
{
int g = ;
for(i = ; i < tn; i++)
{
if(maxz<p[i].y)
{
maxz = p[i].y;
tp = p[i];
}
// if(dcmp(dis(p[i]-p[i+1])-2*r)<0) continue;
// if(dcmp(dis(p[i]-p[i+1])-rd)>0) continue; double b = atan2(fabs(p[i].y-p[i+].y),fabs(p[i].x-p[i+].x));
double d = dis(p[i]-p[i+])/;
double dd = sqrt(-(d*d));
double a = atan2(dd,d);
if(dcmp(a+b-pi/2.0)>) continue;
if(p[i].y<p[i+].y)
{
point pp = point(2.0,);
q[++g] = rotate(pp,a+b);
q[g] = point(q[g].x+p[i].x,q[g].y+p[i].y);
}
else
{
point pp = point(-,);
q[++g] = rotate(pp,-a-b);
q[g] = point(q[g].x+p[i+].x,q[g].y+p[i+].y);
}
}
if(maxz<p[tn].y)
{
maxz = p[tn].y;
tp = p[tn];
}
if(!g) break;
tn = g;
for(i = ; i <= g ; i++)
p[i] = q[i];
}
printf("%.4f %.4f\n",tp.x,tp.y);
}
return ;
}
poj2194Stacking Cylinders的更多相关文章
- acdream:Andrew Stankevich Contest 3:Two Cylinders:数值积分
Two Cylinders Special JudgeTime Limit: 10000/5000MS (Java/Others)Memory Limit: 128000/64000KB (Java/ ...
- zoj 2369 Two Cylinders
zoj 2369 Two Cylinders 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2369 题意:已知两个无 ...
- sicily 1012. Stacking Cylinders & 1206. Stacking Cylinders
Time Limit: 1sec Memory Limit:32MB Description Cylinders (e.g. oil drums) (of radius 1 foot) are ...
- SGU 217. Two Cylinders
题意:给空间内两根圆柱,求轴线垂直相交时公共部分的体积. 暴力积分即可. ID: Date'n'Time: Name: Task: .Ext: Status: Time: Memory: 158937 ...
- UVAlive 7414 Squeeze the Cylinders a,b,c三种步数 搜索+最短路
题意:给你n个点(n<=50),然后有些点之间会有一条路,路是单向的,每个回合让你走a,b,c三种步数中的任意一种(a,b,c<=100),问你最少需要多少个回合才能保证一定能从1点到达n ...
- Linux基础介绍【第九篇】
服务器添加3块磁盘的体系结构 [root@oldboylinux test]# free -m total used free shared buffers cached M ...
- Linux基础介绍【第四篇】
Linux文件和目录的属性及权限 命令: [root@oldboy ~]# ls -lhi total 40K 24973 -rw-------. 1 root root 1.1K Dec 10 16 ...
- liunx 磁盘管理命令记录
Linux磁盘管理好坏管理直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分 ...
- Linux系统中的Device Mapper学习
在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. ...
随机推荐
- C#:实现托盘(任务栏图标与托盘图标互斥)
实现托盘(任务栏图标与托盘图标互斥),并且在点击任务栏图标时实现的最小化与点击最小化按钮分离. 具体如下: 1.向窗体上添加如下控件:MenuStrip menuStrip1, NotifyIcon ...
- 给我发邮件(qq)| 和我联系
qq邮箱开放平台(只能是qq对qq): 简单点的发邮件: 和我联系
- 【转】Tomcat调优指南
转载地址:http://blog.csdn.net/woohooli/article/details/3954792 1 概述 本文档主要介绍了Tomcat的性能调优的原理和方法.可 ...
- 读取EXCEL
package com.wxgs.ch04; import java.io.File;import java.io.IOException; import jxl.Cell;import jxl.Sh ...
- IP Address 分类: POJ 2015-06-12 19:34 12人阅读 评论(0) 收藏
IP Address Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 19125 Accepted: 11053 Desc ...
- vi编辑文件E437: terminal capability "cm" required 解决办法
E437: terminal capability "cm" required 这个错误一般是环境变量TERM没有配置或者配置错误所致. 解决办法: 执行export TERM=x ...
- shell 条件判断参数
-b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若文件存在,则为真 -f ...
- js修改浏览器url
var stateObject = {};var title = "";var newUrl = "/";history.pushState(stateObje ...
- join(添加字符)与id显示
#!/usr/bin/env python li = ["alex",'sb'] l1 = "_".join(li) print(l1) print(id(li ...
- oracle分组统计某列逗号隔开数据
所有版本的oracle都可以使用select wm_concat(name) as name from user; 但如果是oracle11g,使用select listagg(name, ',') ...