试题编号: | 201803-2 |
试题名称: | 碰撞的小球 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。 提示 因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。 输入格式 输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置。 输出格式 输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。 样例输入 3 10 5 样例输出 7 9 9 样例说明 初始时,三个小球的位置分别为4, 6, 8。 样例输入 10 22 30 样例输出 6 6 8 2 4 0 4 12 10 2 数据规模和约定 对于所有评测用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L为偶数。 |
C++ 程序如下
#include<iostream>
using namespace std;
int main()
{
int n, l , t ;
cin >> n >> l >> t;
int pos[n];
int spe[n];
for ( int i=0; i<n;i++)
{
cin >> pos[i];
spe[i] = 1 ;
// 如果恰好在右端点 则 速度相反
if(pos[i] == l )
spe[i] = -spe[i];
}
while(t--)
{
for(int i =0; i<n ; i++)
{
pos[i] += spe[i];
if(pos[i]== l || pos[i] == 0)
spe[i]= -spe[i];
}
for(int j = 0; j < n; j++)
for(int k = j + 1; k < n; k++)
if(pos[k] == pos[j])
spe[k] = -spe[k], spe[j] = -spe[j];
}
for ( int i=0; i<n;i++)
{
cout << pos[i]<< " ";
}
cout<< endl;
return 0 ;
}
思路总结:
1、 第一次尝试 第二题 开始真的是被题吓住了, 看了好多 题解 又是模拟 又是排序 啥的 很晕
以为还要涉及 没有看过的算法 但静下心发现 其实也不难 相比而言就是过程多了 思考的要多了
提示比较重要 ac后整体看来不算难题
2、 吸收到一句话 没有好方法就暴力 没有好方法就模拟。
3、 提交了好几次 每次都发现有这样那样的问题, 认证大赛是黑盒测试 根本不出成绩 需要有绝对的严谨。
4、 看到一些无法理解的 程序 大概是传说的 编程规范吧 现在看来影响不大 而且确实理解不了 先打基础吧
5 、 整个过程没有什么特别的 就是模拟 就是 推演一边过程 细化分步 一步一步来 最后考虑特殊情况
随着代码数增多 养成编程过程中就写注释的习惯。