碰撞的小球-CCF-2018 (看不懂,你捶我,嘿嘿嘿)

碰撞的小球-CCF-2018

题目

(看到这个题目时,让我想起了高中物理。。。。。感觉可以有更简单的方法去做。。。)

在这里插入图片描述
在这里插入图片描述
题目分析:
一、首先
我真的很帅,嘿嘿嘿
二、其次,分析题目

  1. 如果只有一个小球。
    傻子都知道,我就不说了

  2. 如果有两个球。(速度相同,质量相等)
    假设1号球向左走,2号球向右走,你猜猜会发生什么?
    当然是碰撞了,碰完之后呢?
    当然是1号球向右,2号球向左走了

    那么,假如没有编号呢?
    那么这两个球 碰撞 和 没有碰撞 有区别吗?
    初始的时候排在最左端的球会跑到其他球的右面吗?
    (只看初始位置和末位置,不信,你可以去画一画图)
    
  3. 多球同理,可以看成每个球自己一个球在运动,不会与其他球发生碰撞

三、结论
每次只让一个小球移动,其他小球可以当做空气

	代码原理:
	首先我们需要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;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值