1 条题解
-
0
题意 就是有很多个小球从高度为H的平面向地面做自由落体运动,每隔1秒钟掉下一个小球,如果小球在空中碰撞了,那么两个小球直接交换速度(包括大小和方向)。 一看这个题第一个反应就是蚂蚁走线的问题,这个题和蚂蚁走线有很多的相同之处,两个小球相撞可以看成两个小球直接从对方的身体中穿过去了,因为速度交换就可以看做速度没变。但是有一个问题就是小球有半径,两个球碰撞的地方并不是圆心,而是下面小球的上方,上面小球的下方,其实就多了一个2r,下面有一个小球就多一个2r,所以在最后计算结果的时候加一个2r×i就行了。一个小小的坑点就是r单位是cm,高度是m。剩下的就是考的高中的自由落体知识。
#include <algorithm> #include <stdio.h> #include <math.h> using namespace std; const int maxn = 110; const double g = 10.0; double H[maxn]; int n, h, r, t, c; void init() { scanf("%d%d%d%d", &n, &h, &r, &t); } double cal(double times) { if (times <= 0) return h; double T = sqrt(2.0 * (double) h / 10.0); int k = (int) (times / T); if (k & 1)//注意自由落体的计算公式 return (double) h - g * ((double) k * T + T - times) * ((double) k * T + T - times) / 2.0; return (double) h - g * (times - (double) k * T) * (times - (double) k * T) / 2.0; } int main() { scanf("%d", &c); while (c--) { init(); for (int i = 0; i < n; i++) H[i] = cal(t - i); sort(H,H+n); for (int i = 0; i < n; i++) printf("%.2f%c", H[i] + 2.0 * r * i / 100.0, i == n - 1 ? '\n' : ' '); } return 0; }
- 1
信息
- ID
- 2685
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者