1. 问题描述
  2.   数轴上有一条长度为LL为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。
  3.   当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。
  4.   当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动。
  5.   现在,告诉你线段的长度L,小球数量n,以及n个小球的初始位置,请你计算t秒之后,各个小球的位置。
  6. 提示
  7.   因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。
  8.   同时也可以证明两个小球发生碰撞的位置一定是整数(但不一定是偶数)。
  9. 输入格式
  10.   输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置。
  11.   第二行包含n个整数a1, a2, …, an,用空格分隔,表示初始时刻n个小球的位置。
  12. 输出格式
  13.   输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。
  14. 样例输入
  15. 3 10 5
  16. 4 6 8
  17. 样例输出
  18. 7 9 9

思路如下:

每个小球是一个类,分别含有三个属性:方向,位置,编号。然后根据时间的推移对小球的位置进行判断和推移。对小球的属性进行更改。小球存储在list列表中,因为arraylist的查找性能比较强并且有序,将小球信息存储在arraylist中。最后输出球的位置信息。贴一下java代码,欢迎各位大佬批评指正。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Scanner;
  4.  
  5. public class BallMotion {
  6. public static void main(String[] args) {
  7. Scanner sc = new Scanner(System.in);
  8. int ballCount = sc.nextInt();
  9. int lineLen = sc.nextInt();
  10. int time = sc.nextInt();
  11. List<Ball> ballList = new ArrayList<Ball>();
  12. for (int i = 1; i <= ballCount; i++) {
  13. Ball ball = new Ball(i,1,sc.nextInt());
  14. ballList.add(ball);
  15. }
  16. for(int i = 1; i <= time;i++){
  17. //开始时间循环
  18. for(int j = 0; j< ballList.size(); j++){
  19. //是否在尽头
  20. if(ballList.get(j).getPosition() == lineLen || ballList.get(j).getPosition() == 1){
  21. ballList.get(j).setDirction(-ballList.get(j).getDirection());
  22. }
  23. //是否有球重合
  24. for (int k = 0; k< ballList.size(); k++) {
  25. if( k == j){
  26. continue;
  27. }else{
  28. if (ballList.get(j).getPosition() == ballList.get(k).getPosition()) {
  29. //重合时方向两个球的方向都相反
  30. ballList.get(j).setDirction(-ballList.get(j).getDirection());
  31. ballList.get(k).setDirction(-ballList.get(k).getDirection());
  32. }
  33. }
  34.  
  35. }
  36. // 移动位置
  37. ballList.get(j).setPosition(ballList.get(j).getPosition()+ ballList.get(j).getDirection());
  38. }
  39. }
  40. //打印各个小球位置
  41. for(int i = 0; i < ballCount; i++){
  42. System.out.print(ballList.get(i).getPosition()+" ");;
  43. }
  44. }
  45. }
  46.  
  47. class Ball {
  48. private int id;// 编号
  49. private int direction;// 方向,1右 -1左
  50. private int position;// 位置
  51.  
  52. public Ball() {
  53. }
  54.  
  55. public Ball(int id, int direction, int position) {
  56. this.id = id;
  57. this.direction = direction;
  58. this.position = position;
  59. }
  60.  
  61. public void setId(int id) {
  62. this.id = id;
  63. }
  64.  
  65. public void setDirction(int direction) {
  66. this.direction = direction;
  67. }
  68.  
  69. public void setPosition(int position) {
  70. this.position = position;
  71. }
  72.  
  73. public int getId() {
  74. return id;
  75. }
  76.  
  77. public int getDirection() {
  78. return direction;
  79. }
  80.  
  81. public int getPosition() {
  82. return position;
  83. }
  84.  
  85. }

最近练习C++,再贴一把C++代码(思路还是没变,没想到过了这么久,思路还是一样的)

  1. #include<iostream>
  2. #include<list>
  3.  
  4. using namespace std;
  5. class ball {
  6. public:
  7. int id;
  8. int direction;//1为右-1为左
  9. int position;//当前位置
  10. };
  11. int main() {
  12. int ballcount, lineLen, time;
  13. cin >> ballcount >> lineLen >> time;
  14. int pos;
  15. list<ball> balist;
  16. for (int i = ; i <= ballcount; i++) {
  17. cin >> pos;
  18. ball b;
  19. b.id = i;
  20. b.direction = ;
  21. b.position = pos;
  22. balist.push_back(b);
  23. }
  24. //开始计算球每个时刻的位置
  25. list<ball>::iterator bit,tempbit;
  26. for (int i = ; i < time; i++) {
  27. for (bit = balist.begin(); bit != balist.end(); bit++) {
  28. //判断是否在尽头
  29. if (bit->position == lineLen || bit->position == ) {
  30. bit->direction = -;
  31. }
  32. //判断是否有球重合
  33. for (tempbit = balist.begin(); tempbit != balist.end(); tempbit++) {
  34. if (bit->id == tempbit->id) {
  35. continue;
  36. }
  37. else {
  38. if (bit->position == tempbit->position) {
  39. bit->direction = -bit->direction;
  40. tempbit->direction = -bit->direction;
  41. }
  42. }
  43. }
  44. //移动球的位置
  45. bit->position = bit->position + bit->direction;
  46. }
  47. }
  48. //打印球的位置
  49. for (bit = balist.begin(); bit != balist.end(); bit++) {
  50. if (bit == balist.begin()) {
  51. cout << bit->position;
  52. }
  53. else {
  54. cout << " " << bit->position;
  55. }
  56. }
  57. system("pause");
  58. return ;
  59. }

CCF认证201803-2 碰撞的小球 java代码实现。的更多相关文章

  1. 201803-2 碰撞的小球 Java

    思路: 直接按照题意模拟,感觉没什么太好的办法.另外注意:int这种基础数据类型不能用equals这个方法 ,必须是Integer类型 import java.util.Scanner; public ...

  2. CCF CSP 201803-2 碰撞的小球

    题目链接:http://118.190.20.162/view.page?gpid=T72 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段 ...

  3. 碰撞的小球 ccf (模拟)

    问题描述 试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐 ...

  4. ccf认证 201709-4 通信网络 java实现

    试题编号:                                                               201709-4 试题名称: 通信网络 时间限制: 1.0s 内 ...

  5. CCF认证历年试题

    CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...

  6. CCF-201803-2 碰撞的小球

    问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒.当小球到达线段 ...

  7. 【web前端学习部落22群】分享 碰撞的小球开源小案例

    对于课程中的疑问,大家可以加 web前端学习部落22群 120342833和其他老师还有众多的小伙伴们进行沟通交流哦,群里还有不少技术大拿.行业大牛 可以一起探讨问题,我们也会安排专业的技术老师为大家 ...

  8. 小明种苹果(续)第十七次CCF认证

    小明种苹果(续)第十七次CCF认证 题目 原题链接 ](http://118.190.20.162/view.page?gpid=T93) 很高心,在现在CCF CSP可以下载自己当时的答卷了,也就是 ...

  9. 【C++】CCFCSP201803-2碰撞的小球

    // // main.cpp // CCFCSP20180318_2_碰撞的小球 // // Created by T.P on 2018/3/24. // Copyright © 2018年 T.P ...

随机推荐

  1. [转]Shared——回调函数是什么

    本文内容转自知乎 作者:no.body 链接:https://www.zhihu.com/question/19801131/answer/27459821 回调函数(callback)是什么? 什么 ...

  2. 理解position:relative

    前言:position有5个属性:static.absolute.relative.fixed和inherit.本篇博客主要介绍relative属性,因为似乎很多人对这个属性的理解很模糊,而且不清楚r ...

  3. Bookmarklet编写指南

    作者: 阮一峰 日期: 2011年6月11日 前一段日子,我写了两个Bookmarklet----"短网址生成"和"短网址还原". 它们用起来很方便,除了我本人 ...

  4. Maven学习总结(八):Myecplise中配置maven

    第一步:下载maven安装包,配置环境变量M2_HOME;变量值为maven的解压目录. 第二步:在eclipse4.0之前的版本需要安装maven插件,方法即:将maven插件包复制到eclipse ...

  5. 【转】老生常谈-从输入url到页面展示到底发生了什么

    今天看到了一篇很详细地解释了从输入url到页面展示过程的文章,好文章不能错过,所以转到自己这里来了. 原文地址:老生常谈-从输入url到页面展示到底发生了什么 以下为原文: 刚开始写这篇文章还是挺纠结 ...

  6. System.Media.Color与System.Drawing.Color转换方法

    public static System.Media.Color GetMediaColorFromDrawingColor(System.Drawing.Color color) {      re ...

  7. Hive、Spark SQL、Impala比较

    Hive.Spark SQL.Impala比较        Hive.Spark SQL和Impala三种分布式SQL查询引擎都是SQL-on-Hadoop解决方案,但又各有特点.前面已经讨论了Hi ...

  8. ESP8266调试记录

    1.引脚图:使用STM32F103ZET6芯片的串口1  PA9-TX //PA10-RX(该串口挂载到APB2总线时钟)然后分别连接模块的RX和TX,供电使用3.3v(供电一定要稳)但不能超过5v ...

  9. MooseFS安装部署

    环境信息 Master服务器 dev04 chunkserver服务器 dev02.dev03.dev04 metalogger服务器 dev03 mount客户端 dev01.dev02 安装前下载 ...

  10. 新建虚拟机,每次都提示无法连接虚拟设备 ide1:0

    处理方式:看到了这个老哥http://www.cnblogs.com/dean-du/p/6888513.html的博客,发现问题是一样的,所以记录一下. 将虚拟机设置中的CD/DVD选项中的连接更改 ...