美文网首页程序员
POJ3684(弹性碰撞)各种wrong answer踩坑

POJ3684(弹性碰撞)各种wrong answer踩坑

作者: 小太阳花儿 | 来源:发表于2018-03-06 18:01 被阅读6次

我踩过的坑全部都写在注释里面了,供大家参考。

#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;

}

相关文章

网友评论

    本文标题:POJ3684(弹性碰撞)各种wrong answer踩坑

    本文链接:https://www.haomeiwen.com/subject/yhwsaxtx.html