【XSY2558】圆上的蚂蚁 Ants on circle

Description

L个点围成一个圆. 我们选定任意一个点作为原点, 则每个点的坐标为从原点顺时针走到这个点的距离. 圆上有N只蚂蚁, 分别被编号为1到N. 开始时, 第ii只蚂蚁在坐标为Xi的点上. 这N只蚂蚁同时开始移动. 对于每一只蚂蚁i, 给定其初始方向Wi: 假如i开始时是顺时针走的, 则Wi的值为1; 否则为2. 每只蚂蚁的速度均为1. 当某个时刻两只蚂蚁相遇时, 它们都分别都掉头往反方向走.

对于每一只蚂蚁, 请你求出其开始移动T秒后的位置.

Input
输入格式如下:

N L T
X1 W1
X2 W2
:
XN WN

Output
输出N行, 第i为T秒后第i只蚂蚁所在的坐标.

每个坐标都在[0,L−1]之间.

Sample Input

sample input 1:
3 8 3
0 1
3 2
6 1

sample input 2:
4 20 9
7 2
9 1
12 1
18 1
Sample Output

sample output 1:
1
3
0

sample output 2:
7
18
18
1

其实,这题有一个弱化版,那题并不要求按蚂蚁顺序输出,只用从小到大输出有蚂蚁的位置即可。

那题解题的关键在于相遇时的掉头相当于直接穿过去了(因为不要求编号),那这题中的相遇就相当于交换了编号罢了。

所以蚂蚁们T秒后的位置我们可以非常简单地算出来,只是不知道哪一个位置对应哪一只蚂蚁。

所以我们就算出一号蚂蚁在T秒后的Rank,照着Rank输出即可

我们以一只蚂蚁为标准,每有一只蚂蚁倒着穿过它,Rank--,正着穿过它,Rank++。
接下来,按顺序输出即可。

注意:这里的负数如果不被(l)整除,实际上他是多转了一圈的,要再次(--)
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
struct data
{
	int x,w;
}a[N];
bool cmp(data a,data b)
{
	return a.x<b.x;
}
int n,l,t,sum;
int main()
{
	scanf("%d%d%d",&n,&l,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].x,&a[i].w);
		a[i].w--;
	}
	for(int i=1;i<=n;i++)
	{
		if(!a[i].w)
		{
			a[i].x+=t;
		}else{
			a[i].x-=t;
		}
		sum+=a[i].x/l;//计算第1只蚂蚁的Rank
		if(a[i].x%l<0)//这里减少了(是负数,但不整除),要再减一次
		{
			sum--;
		}
		a[i].x=(a[i].x%l+l)%l;
	}
	sort(a+1,a+n+1,cmp);
	sum=(sum%n+n)%n;
	for(int i=sum+1;i<=n;i++)
	{
		printf("%d
",a[i].x);
	}
	for(int i=1;i<=sum;i++)
	{
		printf("%d
",a[i].x);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/2017gdgzoi44/p/11486474.html