题目链接:http://218.28.220.249:50015/JudgeOnline/problem.php?id=1261

题目描述

最近clover迷上了皇室战争,他抽到了一种地狱飞龙,很开心。假设地域飞龙会对距离为d的敌人每秒造成k/d2伤害。假设地域飞龙位于坐标轴原点,以每秒v1的速度向y轴正方向移动,敌人在(x,)的位置,以每秒v2的速度向x轴负方向移动。问,敌人至少有多少血量永远才不会被地狱飞龙喷死。(伤害是连续造成的,不是一秒一秒间断的)

输入

第一行为数据组数T(<=T<=)
每组数据一行,包含4个实数,分别为v1,v2,x,k(≤v1,v2,x,k≤)。 输出 每组数据输出一行,为敌人最小血量,结果保留2为有效数字. 样例输入 样例输出 2.36

题意就不用说了

方法:先找出伤害值与时间t之间的函数关系f(t) = k/((v1*t)^2+(x-v2*t)^2);对这个函数求不定积分,求出在时间0到时间+00的时间内伤害值总和。式子化简为k/((v1^2+v2^2)*t^2-2*x*v2*t+x^2)对t求不定积分

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 100006
#define PI acos(-1)
int main()
{
int T;
scanf("%d",&T);
double v1,v2,x,k;
while(T--)
{
scanf("%lf %lf %lf %lf",&v1,&v2,&x,&k);
///由不定积分1/a*t^2+b*t+c算出a,b,c
double a = v1*v1+v2*v2;
double b = *x*v2*-;
double c = x*x;
if(b*b<*a*c)
{
///当b^2<4ac时,求积分为2/sqrt(4ac-b^2)*arctan(2at+b)/sqrt(4ac-b^2)+C;
double kk = sqrt(4*a*c-b*b);
double s0 = 2.0*atan(b*1.0/kk)/kk;///当t=0;
double s1 = PI*1.0/kk;///当t为+00;
printf("%.2f\n",(s1-s0)*k);
}
else
{
///当b^2>4ac时,求积分为1/sqrt(b^2-4ac)ln|2at+b-sqrt(b^2-4ac)/(2at+b+sqrt(b^2-4ac))|+C;
double kk = sqrt(b*b-*a*c);
double s0 = log(fabs((b-kk)*1.0/(b+kk)))*1.0/kk;///当t=0;
double s1 = 0.0;///当t为+00;
printf("%.2f\n",(s1-s0)*k);
}
}
return ;
}
05-11 13:32