【模拟】【蚂蚁移动】

【题目描述】

        有一根尺子,长度L<=200000,在上面有N(N <= 70000,N < L)只蚂蚁,且没有两只蚂蚁初始位置相同。每只蚂蚁有一个初始方向(左或者右),且它们会爬行,速度都是每秒一个长度单位。当它们碰到另外一个蚂蚁或者尺子的边缘时,它们会立即改变移动的方向(即反向)。

  给定尺子的长度,蚂蚁的只数,以及所有蚂蚁初始的位置和方向。要你求第T秒时每只蚂蚁的位置(1<=T<=1000000)。

【输入格式】

        第一行两个整数L和T。 
  第二行一个整数N,表示蚂蚁的只数。 

  接下来的每行由两部分组成。第一部分是一个整数,表示该蚂蚁的初始位置。第二部分是一个字母,表示初始方向:D表示向右,L表示向左。两部分中间空格。

【输出格式】

        N个整数,表示每只蚂蚁的最终位置。无需按照蚂蚁的原先编号输出,只要按照最终位置坐标递增(非降)的顺序输出坐标即可。

【样例输入】                                                【样例输出】

3 5                                                                                              0

1 D

模拟,注意细节即可。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int l,t,n;
struct que
{
	int x;
	char towards;
}a[70005];
bool cmp(que a,que b)
{
	return a.x<=b.x;
}
int main()
{
	scanf("%d%d%d",&l,&t,&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d %c",&a[i].x,&a[i].towards);
		if(a[i].towards=='D')
		{
			a[i].x+=t;
			a[i].x%=2*l;
			if(a[i].x>=l)
			{
				a[i].x=2*l-a[i].x;
			}
		}
		else
		{
			if(t>=a[i].x)
			{
				a[i].x=t-a[i].x;
				a[i].x%=2*l;
				if(a[i].x>=l)
				{
					a[i].x=2*l-a[i].x;
				}
			}
			else
			{
				a[i].x=a[i].x-t;
			}
		}
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) printf("%d ",a[i].x);
}

猜你喜欢

转载自blog.csdn.net/dy_dream/article/details/80940955