2013长沙现场赛C - Collision

3 篇文章 0 订阅



题意:圆的坐标是(0,0),给它的半径,再给一个范围半径,再给一个硬币的坐标和它的半径,还有他的速度矢量,问这个硬币在给定范围里面待了多久。硬币碰到圆会弹开。这道题直接画图推公式就好了,下面给代码。

#include<iostream>   
#include<cstring>  
#include<cstdio> 
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
#define maxn 10005
#define xx 1000000001
int main() {
	int r1, R, r2, x1, y1, a, b;
	while (scanf("%d%d%d%d%d%d%d", &r1, &R, &r2, &x1, &y1, &a, &b) != EOF) {
		double d = abs(b*x1 - a*y1) / sqrt(pow(a, 2) + pow(b, 2));//算点到线的距离
		if (d >= R + r2) {
			printf("0.000\n");
		}
		else {
			double x = x1 + 0.001*a;
			double y = y1 + 0.001*b;
			if (sqrt(pow(x, 2) + pow(y, 2)) > sqrt(pow(x1, 2) + pow(y1, 2))) {
				printf("0.000\n");
				continue;
			}//如果方向不是靠近原点输出0
			if (d >= r1 + r2) {
				double re = sqrt(pow(R + r2, 2) - pow(d, 2)) / sqrt(pow(a, 2) + pow(b, 2));
				printf("%.3lf\n", re * 2);
			}
			else {
				double re = (sqrt(pow(R + r2, 2) - pow(d, 2)) - sqrt(pow(r1 + r2, 2) - pow(d, 2))) / sqrt(pow(a, 2) + pow(b, 2));
				printf("%.3lf\n", re * 2);
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值