1-2018-3-2小球碰撞

http://118.190.20.162/view.page?gpid=T72

试题编号: 201803-2
试题名称: 碰撞的小球
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述

  数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。
  当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。
  当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动。
  现在,告诉你线段的长度L,小球数量n,以及n个小球的初始位置,请你计算t秒之后,各个小球的位置。

提示

  因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。
  同时也可以证明两个小球发生碰撞的位置一定是整数(但不一定是偶数)。

输入格式

  输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置。
  第二行包含n个整数a1, a2, …, an,用空格分隔,表示初始时刻n个小球的位置。

输出格式

  输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。

样例输入

3 10 5
4 6 8

样例输出

7 9 9

样例说明

  初始时,三个小球的位置分别为4, 6, 8。

  一秒后,三个小球的位置分别为5, 7, 9。

  两秒后,第三个小球碰到墙壁,速度反向,三个小球位置分别为6, 8, 10。

  三秒后,第二个小球与第三个小球在位置9发生碰撞,速度反向(注意碰撞位置不一定为偶数),三个小球位置分别为7, 9, 9。

  四秒后,第一个小球与第二个小球在位置8发生碰撞,速度反向,第三个小球碰到墙壁,速度反向,三个小球位置分别为8, 8, 10。

  五秒后,三个小球的位置分别为7, 9, 9。

样例输入

10 22 30
14 12 16 6 10 2 8 20 18 4

样例输出

6 6 8 2 4 0 4 12 10 2

数据规模和约定

  对于所有评测用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L为偶数。
  保证所有小球的初始位置互不相同且均为偶数。

思路:借助以前做的蚂蚁感冒那题,同样这里可以看作小球直接穿过既可以,同时数据很小,直接模拟每秒的运动即可,

要注意的是之后的顺序问题,其实可以知道球的相对位置是不变的,即它在左边,不管和旁边的怎么撞也不可能撞到右边

去,所以要记录最开始的相对位置的顺序,则可以确定最后的位置输出来的顺序。

#include <iostream>
#include <algorithm>
using namespace std;
int a[105]; //起始坐标
int b[105]; //标记运动的方向
struct node{
	int x;
	int xuhao;
}P[105];

bool cmp(struct node a, struct node b){
	if(a.x < b.x){
		return 1;
	}
	else{
		return 0;
	}
}

int main(){
	int n, L, t;
	cin >> n >> L >> t;
	for(int i = 0; i < n; i++){
		cin >> a[i];
		b[i] = 1;
		P[i].x = a[i], P[i].xuhao = i;
	}
	while(t--){
		for(int i = 0; i < n; i++){
			a[i] += b[i];
			if(a[i] == 0 || a[i] == L){
				b[i] = -b[i];
			}
		}
	}
	sort(a, a + n);
	sort(P, P + n, cmp);
	int c[105];
	for(int i = 0; i < n; i++){
		c[P[i].xuhao] = a[i];  //按照输入顺序输出
	}
	for(int i = 0; i < n; i++){
		cout << c[i] << " ";
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/9537720.html

时间: 2024-11-06 07:27:38

1-2018-3-2小球碰撞的相关文章

小球碰撞墙壁----干掉误差

之前一直在沿用之前听课学来的"千篇一律"的小球碰撞墙壁或者地板的计算方法. 忽然发现,小球碰撞的时候,其实小球有一部分是进入了墙的里面,在小球速度并不快的情况下,或许不明显,但是当小球速度变的更快,小球半径也更大的时候,就没法看了 效果如下 代码如下(所有代码都只在chrome或者safari下能用,因为requestAnimationFrame方法我并没有写兼容): <!doctype html> <html> <head> <meta ch

HTML5 Canvas彩色小球碰撞运动特效

脚本简介 HTML5 Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效. 效果展示 http://hovertree.com/texiao/html5/39/ 效果图如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML5 Canvas彩色小球碰撞运动特效

Canvas+Js制作动量守恒的小球碰撞

目的:通过js实现小球碰撞并实现动量守恒 canvas我们就不多说了,有用着呢. 我们可以通过canvas画2D图形(圆.方块.三角形等等)3D图形(球体.正方体等待). 当然这只是基础的皮毛而已,canvas的强大之处在于可以做游戏,导入模型,粒子效果,实现漫游又或者全景和VR. 这里我们介绍纯js写的2D小球碰撞.(主要是博主的Three.js不咋地) 好吧,老规矩,先上图! 额...很尴尬的是博主的截图功底不咋地,没有截下碰撞的瞬间. 话不多说,开始教程. 首先我们需要创建画布给它一个id

小球碰撞

采用java awt以及swing写的小球碰撞 线程是一个非常重要的知识块!!! //球类 public class Ball { //1.属性:所有球的共同的字段 int x; int y; int d;//球的半径 int speed;//速度 int dir; //方向 Color c;//颜色 //定义四个方向 public static final int LEFT_UP = 1;//左上 public static final int LEFT_DOWN = 2;//左下 publi

Unity学习笔记 之 发射小球碰撞物体的代码记录

绑定在摄像机上的脚本 using UnityEngine; using System.Collections; public class abc : MonoBehaviour { //设置移动速度 public int speed = 5; //设置将被初始化载入的对象 public Transform newobject = null; // Use this for initialization void Start () { } // Update is called once per

【鸡年大吉】,不知道写点啥,放个demo(小球碰撞)吧,有兴趣的看看

最初的想法是仿写win7的泡泡屏保效果,但是对于小球的斜碰问题一直没搞明白(如果你会这个,欢迎留言或者做个demo),所以只是简单处理了碰撞后的速度,有时候会看起来很搞笑~~~funny guy 话不多说,先上demo https://win7killer.github.io/can_ps/src/demo/ball.html 效果如下: code: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 4 <head> 5

JS (canvas) 两个小球碰撞

<style media="screen"> * { margin: 0; padding: 0; } canvas { box-shadow: 0 0 40px black; margin: 50px; } </style> <canvas id="canvas" width="500" height="500">您的浏览器不支持canvas</canvas> <scri

java实现小球碰撞反弹

首先我们要在一个窗口里面显示这个功能,因此引入JFrame类然后创建一个窗口代码如下:JFrame win=new JFrame();//新建窗口 win.setLocation(250,100);//设置窗口位置 win.setSize(800,600);//设置窗口大小 win.show();//显示窗口win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭退出显示如下:要实现这个功能做基础的就是要有一个小球,就像人吃饭这句话,少了

多线程之碰撞小球

弹球游戏是一款模拟多线程运行的游戏,利用继承Thread实现多线程. 效果图:小球之间会相互碰撞并交换速度在弹开.按钮能实现随机添加.移除小球并暂停小球移动. 具体实现: 1.创建界面(包含主函数). public class BallFrame extends JFrame {public static void main(String[] args) { BallFrame bf = new BallFrame(); bf.initUI(); } public void initUI(){