我踩过的坑全部都写在注释里面了,供大家参考。
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h> //据说缺了这个会导致某些编译器出错
using namespace std;
int N,H,R,T;
double height[105]; //目前所有double变量最一开始我都用的是float,导致一直wrong answer 后来发现float会损失精度,ACM还是尽量用double
double g = 10.0;
double cal(int time)
{
if(time<0) //一个很小的T遇到一个放的很高的球可能导致还没轮到这个球下落 边界处理不能少
{
return H;
}
double t = sqrt(2.0*H/g); //为什么这里你用的是H而不是H+2*R*i呢 是因为把碰撞时的对方看做碰撞后的新的自己,那么对方的直径是自己没有走的一段路。
int k = int(time/t);
if(k%2==0)
{
double t1 = time-k*t;
return H-g*t1*t1/2;
}
else{
double t2 = k*t+t-time;
return H-g*t2*t2/2;
}
}
int main()
{
int num=0;
scanf("%d",&num);
for(int j=0;j<num;j++)
{
scanf("%d%d%d%d",&N,&H,&R,&T);//%d之间不能有空格
for(int i=0;i<N;i++)
{
height[i] = cal(T-i);
}
sort(height,height+N);
for(int i = 0;i<N;i++)
{
printf("%.2lf%c",height[i]+2*R*i/100.0,i==N-1?'\n':' ');
}
}
return 0;
}
网友评论