圆形奖章给定半径的半径和圆形区域。另一个硬币的半径,然后在桌面上平稳。给定硬币的速(的大小和方向,vx,vy)和坐标(奖牌同心圆形区域,圆和心脏为源),Q币在一个圆形区域和多少下滑(不管是什么圆形区域的一部分被认为是),币碰到圆奖牌会反弹。能量不变(速度不变)

第一次做平面几何题

看了题解,题解的板子真好用

大概来说有三种情况。例如以下图

第一种是进入圆区而不碰撞,查看h和Rm+r的关系

另外一种是进入圆区且碰撞,查看h和Rm+r的关系

第三种是不进入圆区。查看方向向量和圆心到初始点向量这两个向量的夹角还有h和R+r的关系。并且应该先看向量,也能够先看R+r再讨论向量

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
#define PI acos(-1.0)
#define maxn 100005
#define INF 0x7fffffff
#define eps 1e-8
using namespace std;
int cmp(double x) {
if(fabs(x)<eps)
return 0;
if(x>0)
return 1;
return -1;
}
inline int sgn(double n) {
return fabs(n)<eps? 0:(n<0?-1:1);
}
inline double sqr(double x) {
return x*x;
}
struct point{
double x,y;
point() {}
point(double a,double b):x(a),y(b) {}
void input() {
scanf("%lf%lf",&x,&y);
}
friend point operator + (const point &a,const point &b) {
return point(a.x+b.x,a.y+b.y);
}
friend point operator - (const point &a,const point &b) {
return point(a.x-b.x,a.y-b.y);
}
friend bool operator == (const point &a,const point &b) {
return cmp(a.x-b.x)==0 &&cmp(a.y-b.y)==0;
}
friend point operator * (const point &a,const double &b) {
return point(a.x*b,a.y*b);
}
friend point operator * (const double &a,const point &b) {
return point(a*b.x,a*b.y);
}
friend point operator / (const point &a,const double &b) {
return point(a.x/b,a.y/b);
}
double norm() {
return sqrt(sqr(x)+sqr(y));
}//到原点距离
void out () const {
printf("%.2f %.2f",x,y);
}
};
double det (const point &a,const point &b) {
return a.x*b.y-a.y*b.x;
}//叉积
double dot (const point &a,const point &b) {
return a.x*b.x+a.y*b.y;
}//点乘
double dist (const point &a,const point &b) {
return (a-b).norm();
}//距离
point rotate_point(const point &p,double A) {
double tx=p.x,ty=p.y;
return point (tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));
}//旋转,A是弧度
struct line {
point a,b;
line() {}
line(point x,point y):a(x),b(y) {}
point dire()const {
return b-a;
}//向量
double len() {
return dire().norm();
}
};
bool parallel(line a,line b) {
return !cmp(det(a.a-a.b,b.a-b.b));
}
bool line_make_point (line a,line b,point &res) {
if(parallel(a,b))
return false;
double s1=det(a.a-b.a,b.b-b.a);
double s2=det(a.b-b.a,b.b-b.a);
res=(s1*a.b-s2*a.a)/(s1-s2);
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("/home/rainto96/in.txt","r",stdin);
#endif
double Rm,R,r,x,y,vx,vy;
while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&Rm,&R,&r,&x,&y,&vx,&vy)){
point s=point(x,y);
point dir=point(vx,vy);
if(dot(s,dir)>=0){
printf("0.000\n");
continue;
}
point tmp=point(vy,-vx);
line l1=line(point(0,0),tmp);
line l2=line(s,point(s.x+vx,s.y+vy));
point ans;
line_make_point(l1,l2,ans);
double h=ans.norm();
double h1=R+r;
double h2=Rm+r;
double speed=sqrt(vx*vx+vy*vy);
if(h>=h1){
printf("0.000\n");
continue;
}
if(h>=h2){
double time=sqrt(h1*h1-h*h)/speed*2;
printf("%f\n",time);
continue;
}else{
double time=sqrt(h1*h1-h*h)-sqrt(h2*h2-h*h);
time=time/speed*2;
printf("%f\n",time);
continue;
}
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU 4793 2013 Changsha Regional Collision[简单的平面几何]的更多相关文章

  1. 2013 Changsha Regional 一样的木板一样的气球

    气球:      木板:   比赛现场: 场外: 曲线....  除了第一题出的太慢了,总体比成都好了很多.... 自此,今年两铜收场,再接再厉,明年要有更好的成绩.

  2. HDU 4793 Collision (2013长沙现场赛,简单计算几何)

    Collision Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  4. 致初学者(一): HDU 2000~ 2013题解

    对于开始学习C语言程序设计或C++程序设计面向过程部分的同学来说,利用在线OJ网站进行实践训练,对提高自己的编程能力很有好处.国内外OJ网站很多,每个都去看看,去刷个题,是不现实的,也没必要.即使一个 ...

  5. 2013 Asia Regional Changchun C

    Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K ( ...

  6. HDU 5795 A Simple Nim(简单Nim)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  7. HDU 5073 Galaxy (2014 Anshan D简单数学)

    HDU 5073 Galaxy (2014 Anshan D简单数学) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5073 Description G ...

  8. HDU 4793 Collision(2013长沙区域赛现场赛C题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793 解题报告:在一个平面上有一个圆形medal,半径为Rm,圆心为(0,0),同时有一个圆形范围圆心 ...

  9. HDU 4793 Collision (解二元一次方程) -2013 ICPC长沙赛区现场赛

    题目链接 题目大意 :有一个圆硬币半径为r,初始位置为x,y,速度矢量为vx,vy,有一个圆形区域(圆心在原点)半径为R,还有一个圆盘(圆心在原点)半径为Rm (Rm < R),圆盘固定不动,硬 ...

随机推荐

  1. quick-cocos2d-x endToLua 退出会卡住

    问题: 马上赚钱,退出会出现卡住,然后清理,死界面的情况,百思不得其解,昨天在做push的时候,突然发现.在android里面弹出一个退出对话框,点击确定退出,这时候调用endtolua时,有时也会切 ...

  2. 实现DataGridView行的拖动,即实现行的顺序交换

    参考:http://blog.csdn.net/soarheaven/article/details/3267379 1.界面准备 (1)首先在form中添加一个DataGridView控件,将默认A ...

  3. linux基于学习

    1.还有一个文件名前".",它代表的文件""隐藏文件". 2.chgrp:改变文件所属用户组 chown:改变文件全部者 chmod:改变文件的权限 ...

  4. LeetCode——Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  5. hdu4888 Redraw Beautiful Drawings

    14更多学校的第二个问题 网络流量   分别以行,列作为结点建图 i行表示的结点到j列表示的结点的流量便是(i, j)的值 跑遍最大流   若满流了便是有解   推断是否unique  就是在残余网络 ...

  6. android4.4组件分析--service组件-bindService源代码分析

    6.1.1.    bindService 由于有前面分析startService的代码实现过程,则对于bindService的代码分析就不用那么具体介绍,在介绍流程的同一时候更关注一些细节上的部分. ...

  7. ANDROID L——Material Design详细解释(UI控制)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  8. SQL Server审计功能入门:更改跟踪(Change Tracking)

    原文:SQL Server审计功能入门:更改跟踪(Change Tracking) 介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制.常规的,自定义变更跟踪和读取跟踪数据, ...

  9. 博客搬到了http://xianglong.me

    自己用Django建立个人博客.这个博客的部分已经迁移到新的个人博客. 博客地址:龙 (http://xianglong.me),欢迎. 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  10. 82. NotesclientPrint相同的信息,以状态栏的问题

    这可能是一个小问题.但其他人也应该得到满足.在Notesclient使用LotusScript的Print当该语句是输出到状态栏,假设实际参数传递多次调用相同,状态栏将显示只有一次的信息. 例如: P ...