题意:
光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射。

学到了向量模板,写法简洁。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define clc(a,b) sizeof(a,b,sizeof(a))
#define LL long long
#include<cmath>
using namespace std;
struct node {
double dis(node);//两点距离 //向量操作
node add(node);//加
double mul(node);//乘
node mul(double);//倍
double abs();//模长
node unt();//单位化
node neg();//取反
double agl(node);//夹角,度数
bool eql(node);//向量相等
int pal(node);//向量平行 double x,y;
};
double node::dis(node a) {
return sqrt(pow(x-a.x,)+pow(y-a.y,));
} node node::add(node a) {
return {x+a.x,y+a.y};
}
double node::mul(node a) {
return x*a.x+y*a.y;
}
node node::mul(double a) {
return {x*a,y*a};
}
node node::neg() {
return {-x,-y};
} double node::abs() {
return sqrt(x*x+y*y);
}
node node::unt() {
double d=this->abs();
return {x/d,y/d};
}
double node::agl(node a) {
return acos((x*a.x+y*a.y)/(this->abs()*a.abs()));
} bool node::eql(node a) {
if(fabs(x-a.x)<1e-&&fabs(y-a.y)<1e-)return ;
return ;
}
int node::pal(node a) {
node u1=this->unt();//判断单位向量
node u2=a.unt();
if(u1.eql(u2))return ;//方向相同
if(u1.eql(u2.neg()))return -;//方向相反
return ;
} double r;
node A,B,C,O;
node AB,AC,AO; int stop() {
double a=B.dis(O);
double b=A.dis(O);
if(a<r||b<r)return ;
double c=A.dis(B);
double p=(a+b+c)/;
double s=sqrt(p*(p-a)*(p-b)*(p-c));
if(c>a&&c>b) {
if(*s/c<r)return ;
return ;
}
return ;
} int only() {
if(AC.pal(AB)==)return ;
return ;
} double root(double a,double b,double c) {
return (-b-sqrt(b*b-*a*c))/(*a);
} void getc() {
double ao=A.dis(O);
double ac=root(,-*ao*cos(AC.agl(AO)),ao*ao-r*r);
C=A.add(AC.unt().mul(ac));
} int fun(node a,node b,node c) {
if(a.add(b).pal(c)==)return ;
return ;
} int jude() {
AB= {B.x-A.x,B.y-A.y};
AO= {O.x-A.x,O.y-A.y};
if(stop())return ;
if(only())return ; getc();
node CB= {B.x-C.x,B.y-C.y};
node OC= {C.x-O.x,C.y-O.y};
if(fun(AC.neg().unt(),CB.unt(),OC.unt()))return ;
return ;
}
int main() {
int T;
scanf("%d",&T);
for(int kase=; kase<=T; kase++) {
scanf("%lf%lf%lf",&O.x,&O.y,&r);
scanf("%lf%lf%lf%lf",&A.x,&A.y,&AC.x,&AC.y);
scanf("%lf%lf",&B.x,&B.y);
printf("Case #%d: ",kase);
if(jude())printf("Yes\n");
else printf("No\n");
}
return ;
}

ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem的更多相关文章

  1. UVAlive7141 BombX 14年上海区域赛D题 线段树+离散化

    题意:一个无限大的棋盘, 有n个小兵, 给出了n个兵的坐标, 现在有一个长为width 高为height的炸弹放在棋盘上, 炸弹只能上下左右平移, 不能旋转. 且放炸弹的区域不能含有士兵, 炸弹可以一 ...

  2. UVALive 7148 LRIP 14年上海区域赛K题 树分治

    题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及 ...

  3. Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)

    http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=c ...

  4. 2019 ICPC 上海区域赛总结

    2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...

  5. HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~

    F - Almost Sorted Array Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  6. 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem

    2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...

  7. hdu5080:几何+polya计数(鞍山区域赛K题)

    /* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...

  8. HDU 4438 Hunters 区域赛水题

    本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数 ...

  9. ACM学习历程—HDU5476 Explore Track of Point(平面几何)(2015上海网赛09题)

    Problem Description In Geometry, the problem of track is very interesting. Because in some cases, th ...

随机推荐

  1. Python设计模式——外观模式

    外观模式跟代理模式有点像,都是在client和目标的类之间建一个中间的类,client不直接调用目标的类,而是通过先调用中间类的方法,由中间类来实现怎么调用目标类. 代理模式用这种模式的目的是可以实现 ...

  2. Pycharm使用技巧

    1.代码配色,即主题 pycharm自带的配色方案都很难看,网上的配色方案又很难看,所以根据其他ide的Monokai配色方案,自己定义了一个. pycharm Monokai主题下载:http:// ...

  3. Python的设计模式学习

    1.工厂模式 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class ADD(): def getResult(self,*args): ret ...

  4. SQL函数说明大全 (转)

    一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下表给出了T-SQL函数的类别和描 ...

  5. 【IT历史】SP和CP

    1.什么是SP?SP是英文Service Provider的缩写,中文翻译为服务提供商,通常是指在移动网内运营增值业务的社会合作单位.它们建立与移动网络建立相连的服务平台,为手机用户提供一系列信息服务 ...

  6. 关于tabBar的图片不能正常显示问题

    可以先把图片的源文件的名称后面加上@2x  这种图片显示不正常问题原因可能是没有二倍图造成的!!

  7. [JavaScript] 用html5 js实现浏览器全屏

    项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的 效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以 让页面中的图片,视频等全屏目前只有g ...

  8. apt-get命令讲解

    apt-get是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统. apt-get是debian,ubuntu发行版的包管理工具 ...

  9. Codeforces Round #211 (Div. 2)

    难得一次比赛能够自己成功A掉四个题: A题:水题,模拟一下就行: #include <iostream> #include <cstdio> using namespace s ...

  10. const变量的存储区及修改权限

    转自const变量的存储区及修改权限 [cpp] view plaincopy const int a = 1; int *p = const_cast<int*>(&a); *p ...