CSP 201803-2 碰撞的小球 中级模拟※※

201803-2 碰撞的小球

pair

#include<utility>
pair<int,int> ball;
pair<int,int> ball(1,0);//first初始化为1,second初始化为0

ball.first;
ball.second;

MyAnswer

#include<iostream>
#include<utility>
#include<memory.h>
using namespace std;
int main()
{
	int n, l, t;//n小球个数,L线段长度,t时间
	cin >> n >> l >> t;
	pair<int, int> *ball = new pair<int, int>[n + 1];//数组下标为小球标号,first记录位置,second记录运动方向
	int *line = new int[l + 1];//记录每个位置的小球数
	memset(line, 0, (l + 1) * sizeof(int));
	for (int i = 1; i < n+1; i++)
	{
		cin >> ball[i].first;
		ball[i].second = 1;
		line[ball[i].first]++;
	}
	for (int i = 1; i <= t; i++)//共t秒
	{
		//更新小球位置
		for (int j = 1; j <= n; j++)
		{
			int pos = ball[j].first;
			int dir = ball[j].second;
			line[pos]--;//更新位置上的小球数
			line[pos + dir]++;
			ball[j].first += ball[j].second;
		}
		//小球碰撞则反向
		for (int j = 0; j <= l; j++)
		{
			if (line[j] == 2)
			{
				for (int k = 1; k <= n; k++)
				{
					if (ball[k].first == j)
						ball[k].second *= -1;
				}
			}
		}
		//小球触壁则反向
		for (int k = 1; k <= n; k++)
		{
			if (ball[k].first == 0 || ball[k].first == l)
				ball[k].second *= -1;
		}	
	}
	for (int i = 1; i <= n; i++)
	{
		cout << ball[i].first<<" ";
	}
	cout << endl;
	delete[]ball;
	delete[]line;
	return 0;
}

1.需要保存哪些数据?小球的标号,位置,速度方向,每个位置的小球数

用什么保存

2.数组下标与小球标号的统一,是从0开始还是从1开始

3.L与n区分清楚

中级模拟并不困难,过程走得细心,很快就可以解决,如果过程有误,很难有耐心检查,注意手动debug和打印debug共用

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值