hdu 4998 Rotate 点的旋转 银牌题
Rotate
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1232 Accepted Submission(s): 545
Special Judge
Your little sister likes to rotate things. To put it easier to analyze, your sister makes n rotations. In the i-th time, she makes everything in the plane rotate counter-clockwisely around a point ai by a radian of pi.
Now she promises that the total effect of her rotations is a single rotation around a point A by radian P (this means the sum of pi is not a multiplier of 2π).
Of course, you should be able to figure out what is A and P :).
For each test case, the first line contains an integer n denoting the number of the rotations. Then n lines follows, each containing 3 real numbers x, y and p, which means rotating around point (x, y) counter-clockwisely by a radian of p.
We promise that the sum of all p's is differed at least 0.1 from the nearest multiplier of 2π.
T<=100. 1<=n<=10. 0<=x, y<=100. 0<=p<=2π.
Your answer will be considered correct if and only if for x, y and p, the absolute error is no larger than 1e-5.
3
0 0 1
1 1 1
2 2 1
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set> #define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define CT continue
#define SC scanf const double eps=1e-8;
const double pi=acos(-1);
int cas,n; struct Point{
double x,y,pi;
void read(){
SC("%lf%lf%lf",&x,&y,&pi);
}
}p[15]; int dcmp(double a)
{
if(fabs(a)<eps) return 0;
else return a>0?1:-1;
} double dot(Point a,Point b)
{
return a.x*b.x+a.y*b.y;
} double Length(Point a)
{
return sqrt(a.x*a.x+a.y*a.y);
} Point operator*(double k,Point a)
{
return (Point){k*a.x,k*a.y,0};
} Point operator-(Point a,Point b)
{
return (Point){a.x-b.x,a.y-b.y,0};
} Point operator+(Point a,Point b)
{
return (Point){a.x+b.x,a.y+b.y,0};
} Point Rotate(Point a,double rad)
{
return (Point){a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad),0};
} Point Normal(Point a)
{
double L=Length(a);
return (Point){-a.y/L,a.x/L,0};
} void R(Point &s,Point &t,Point &nor,Point &mid)
{
s=p[0];
for(int i=1;i<=n;i++){
Point v=p[0]-p[i];
v=Rotate(v,p[i].pi);
p[0]=p[i]+v;
}
t=p[0];
nor=Normal(t-s),mid=(Point){(s.x+t.x)/2,(s.y+t.y)/2,0};
} double cross(Point a,Point b)
{
return a.x*b.y-b.x*a.y;
} Point Getlineintersection(Point p,Point v,Point q,Point w)
{
Point u=p-q;
double t=cross(w,u)/cross(v,w);
return p+t*v;
} int main()
{
SC("%d",&cas);
while(cas--)
{
SC("%d",&n);
for(int i=1;i<=n;i++) p[i].read();
Point s1,t1,s2,t2,nor1,nor2,mid1,mid2,o;
p[0]={12,9,0};
R(s1,t1,nor1,mid1);
p[0]={3,17,0};
R(s2,t2,nor2,mid2); o=Getlineintersection(mid1,nor1,mid2,nor2);
Point os=s1-o,ot=t1-o; double ang,ang1=atan2(os.y,os.x),ang2=atan2(ot.y,ot.x);
if(dcmp(ang1-ang2)>0) ang=ang1-ang2;
else ang=ang2-ang1; if(dcmp(cross(t1-s1,o-s1))>0){
if(dcmp(ang-pi)>0) ang=2*pi-ang;
}
else {
if(dcmp(pi-ang)>0) ang=2*pi-ang;
} if(dcmp(o.x)==0) o.x=0;
if(dcmp(o.y)==0) o.y=0;
printf("%.10f %.10f %.10f\n",o.x,o.y,ang);
}
return 0;
}
1.因为题目保证有解,所以在平面上任取两点,求出旋转后的弧度,那么最后选装的圆心必定在两条
从起点到终点的中垂线上
2.找到圆心后,再依据圆心在向量st的左侧还是右侧确定旋转的弧度是>pi还是小于pi。
3.最后因为double表示数据时,0可能是2*1e-30,按%.10f输出则是-0.00000000,所以需要
在最后判断一下。
hdu 4998 Rotate 点的旋转 银牌题的更多相关文章
- HDU 4998 Rotate (计算几何)
HDU 4998 Rotate (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4998 Description Noting is more ...
- HDU 4998 Rotate --几何
题意:给n个点(x,y,p),从1~n,一次每次所有点绕着第 i 个点(原来的)逆时针转pi个弧度,问最后所有点的位置相当于绕哪个点旋转多少弧度,求出那点X和弧度P 解法:直接模拟旋转,每次计算新的坐 ...
- HDU 4998 Rotate
题意: n次旋转 每次平面绕ai点旋转pi弧度 问 最后状态相当于初始状态绕A点旋转P弧度 A和P是多少 思路: 如果初始X点的最后状态为X'点 则圆心一定在X和X'连线的垂直平分线上 那 ...
- HDU 2096 小明A+B --- 水题
HDU 2096 /* HDU 2096 小明A+B --- 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen(&quo ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- HDU 4998 (点的旋转) Rotate
为了寻找等效旋转操作,我们任选两个点P0和Q0,分别绕这n个点旋转一定的角度后最终得到Pn和Qn 然后已知:P0和Pn共圆,Q0和Qn共圆.所以要找的等效旋转点就是这两个线段的垂直平分线交点O. 等效 ...
- hdu 4998 矩阵表示旋转
http://acm.hdu.edu.cn/showproblem.php?pid=4998 http://blog.csdn.net/wcyoot/article/details/33310329 ...
- hdu 5514 Frogs 容斥思想+gcd 银牌题
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- hdu 4998
http://acm.hdu.edu.cn/showproblem.php?pid=4998 这道题,在比赛的时候看了很久,才明白题目的大意.都怪自己不好好学习英语.后来经过队友翻译才懂是什么意思. ...
随机推荐
- VS2017生成一个简单的DLL文件 和 LIB文件——C语言
下面我们将用两种不同的姿势来用VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件) 生成动态库文件 姿势一 ...
- HTTP协议探究(一):缓存
一 复习与目标 1 复习 序章主要用WrieShark抓包HTTP报文 复习了TCP协议 讲述了TCP协议与HTTP之间的关系 HTTP1.1更新原因:HTTP1.0一次TCP连接只能发送一次HTTP ...
- 用101000张图片实现图像识别(算法的实现和流程)-python-tensorflow框架
一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是准确率真的非 ...
- About Spring MVC
一.简介 1.Springmvc是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解 ...
- Android项目笔记整理(1)
第二部分 工作项目中以及平时看视频.看书或者看博客时整理的个人觉得挺有用的笔记 1.Activity界面切换: if(条件1){ setContentView(R.layout.ma ...
- 如何使用Chrome开发者工具找到Marketing Cloud某个contact的guid
我们使用nodejs对contact进行修改时,需要指定待修改contact实例的guid. 这个guid属于technical属性,在Marketing Cloud UI上默认情况下不可见.如何找到 ...
- 使用jMeter构造大量并发的随机HTTP请求
在前一篇文章使用jMeter构造大量并发HTTP请求进行微服务性能测试里,我介绍了如何用jMeter构造并发HTTP请求.但是通过文中介绍的方式构造的并发请求,其请求参数都是硬编码的'Wang'. 有 ...
- async/await 处理多个网络请求同步问题
1.async/await是基于Promise的,是进一步的一种优化,await会等待异步执行完成 getProjectTask(id){ this.axios.get('/api/v1/task/' ...
- spring 整合mongodb报NoSuchMethodError错误
刚开始通过网上查到相关的资料进行了一些配置,参考链接:http://www.open-open.com/lib/view/open1454374782167.html maven的dependenci ...
- pytorch转onnx问题
Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchA ...