碰撞的小球-CCF-2018
题目
(看到这个题目时,让我想起了高中物理。。。。。感觉可以有更简单的方法去做。。。)
题目分析:
一、首先
我真的很帅,嘿嘿嘿
二、其次,分析题目
-
如果只有一个小球。
傻子都知道,我就不说了 -
如果有两个球。(速度相同,质量相等)
假设1号球向左走,2号球向右走,你猜猜会发生什么?
当然是碰撞了,碰完之后呢?
当然是1号球向右,2号球向左走了那么,假如没有编号呢? 那么这两个球 碰撞 和 没有碰撞 有区别吗? 初始的时候排在最左端的球会跑到其他球的右面吗? (只看初始位置和末位置,不信,你可以去画一画图)
-
多球同理,可以看成每个球自己一个球在运动,不会与其他球发生碰撞
三、结论
每次只让一个小球移动,其他小球可以当做空气
代码原理:
首先我们需要3个数组 w1[] 初始状态,w2[] 变化后状态 ,w3[] 最终结果
1,对w1[] w2[] 初始化(下标代表球编号,数值代表球位置)
2,让w2[] 让每个小球单独移动(其他球当做空气)
3,得到的w2[] 进行从小到大排序
4,关键: 在w1[] 中找到位置排名最大的小球编号(假如说是t号小球最靠右边)
把w2[] 中最后一个元素 s 放到w3[t]里面 (假如说第一回取的是w2[9],下次取w2[8],下下次取w2[7]..........)
遍历一次,即可得到结果,结果就在w3[]里面
#include<bits/stdc++.h> //万能头文件,不要告诉我你不知道
using namespace std;
int w1[100]={0}; // 原数组
int w2[100]={0}; //碰撞结束后的数组
int w3[100]={0}; //答案存储的数组
int n,l,t,a; //n--小球个数 l--数轴长度 t--时间 a--临时变量
int main()
{
//输入
cin >> n >> l >> t;
for(int i=1;i<=n;i++){ //注意数组下标
cin >> w1[i];
w2[i]=w1[i]; //复制一份相同的
}
//小球开始碰撞 对 w2 进行改变
for(int i=1;i<=n;i++){
int tem=t,d=1;
while(tem--){
// d==1 方向向右 d==0 方向向左
if(d==1) w2[i]++;
else w2[i]--;
//如果符合,改变方向
if(w2[i]==l)d=0;
if(w2[i]==0)d=1;
}
}
//对 w2进行排序
sort(w2,w2+n+1);
//关键
for(int i=1;i<=n;i++){
t=i;
for(int j=1;j<=n;j++){
if(w1[t]<w1[j])t=j; //为了找出 w1 中最大的下标
}
w3[t]=w2[n+1-i]; //把答案放入 w3 里面
w1[t]=-1; //防止下次找最大值时,再次找到它
}
//输出答案
for(int i=1;i<=n;i++)
cout << w3[i] << " ";
return 0;
}