您的位置首页  散文随笔

一篇读懂小球碰撞(小球碰撞实验)

有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。

一篇读懂小球碰撞(小球碰撞实验)

 

问题描述数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒 当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。

当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动 现在,告诉你线段的长度L,小球数量n,以及n个小球的初始位置,请你计算t秒之后,各个小球的位置提示因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。

同时也可以证明两个小球发生碰撞的位置一定是整数(但不一定是偶数)输入格式输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置 第二行包含n个整数a1, a2, …, an,用空格分隔,表示初始时刻n个小球的位置。

输出格式输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。样例输入3 10 54 6 8样例输出7 9 9

这个题主要是先给小球进行排序,因为排序之后,我们根据题意可以知道,只有相邻的小球才能相撞然后把之前排序的位置倒回来好了,直接给大家上代码#include #include #include using namespace std; int main() { int n, L, t;//分别是小球个数、线段长度、t秒 cin >> n >> L >> t; int num[n];//记录小球的当前位置 int copy[n]; int site[n];//记录小球排序之前的位置,因为要进行排序 int direction[n];//记录小球的方向 int min = 1001;//记录排序循环的最小值 for(int i = 0; i < n; i++) { direction[i] = 1; } //0代表向左,1代表向右 for(int i = 0; i > num[i]; } for(int i = 0; i < n; i++) { copy[i] = num[i]; } sort(num, num + n);//排序 for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(num[i] == copy[j]) { site[i] = j;//为了记录排序之前每个小球的位置 } } } int sign = 0;//判断有没有撞上的标志位 for(int i = 0; i < t; i++)//对t秒进行循环 { for(int j = 0; j < n; j++) { if(direction[j] == 0) { num[j]--; } else { num[j]++; } } for(int j = 0; j < n; j++) { if(num[j] == 0) { direction[j] = 1; } if(num[j] == num[j-1]) { direction[j-1] = (direction[j-1] + 1)% 2; direction[j] = (direction[j] + 1)% 2; } if(num[j] == L) { direction[j] = 0; } } } for(int i = 0; i < n; i++) { copy[site[i]] = num[i];//把之前的小球位置都弄回来 } for(int i = 0; i < n; i++) { cout << copy[i] << " "; } cout << endl; return 0; } 。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186