Uva10881 Piotr's Ants

題意,長度爲L的木棒上有n只螞蟻,每隻螞蟻要麼向左,要麼向右,相撞的時候則會改變方向,問T秒後,媽媽的位置和方向

這道題我們把螞蟻抽象成一個個點來的話,我們會發現,螞蟻碰撞之後,就像兩個點“對穿而過:所以我們要計算出T秒後每個螞蟻的位置

但是T秒過後對應的位置上不一定是那隻螞蟻,可能是別的螞蟻。我們就要搞清楚”誰是誰“

通過模擬發現,螞蟻經過T時間之後,相對順序是不變的。所以我們把前後的位置排個序。則移動後的從左到右的順序還是從左到右。但輸入的時候並不是從左到右,所以我們還要用一個order數組記錄輸入的順序

AC代碼如下:

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=10000+100;
const char dirName[][10]={"L","Turning","R"};
int order[maxn];
struct node
{
	int id;
	int p;
	int d;
};
bool cmp(node A,node B)
{
	return A.p<B.p; 
}
node b[maxn],a[maxn];
int main()
{
	int t,n,cas=0,T,L;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d %d",&L,&T,&n);
		for(int i=0;i<n;i++)
		{
			int x;
			char ch;
			int p;
			scanf("%d %c",&x,&ch);
			int d=(ch=='L'?-1:1);
			b[i].id=i;
			b[i].p=x;
			b[i].d=d;
			a[i].id=0;
			a[i].p=x+T*d;
			a[i].d=d;
		}
		sort(b,b+n,cmp);
		for(int i=0;i<n;i++)
		order[b[i].id]=i;
		sort(a,a+n,cmp);
		for(int i=0;i<n-1;i++)
		{
			if(a[i].p==a[i+1].p)
			{
				a[i].d=a[i+1].d=0;
			}
		}
		printf("Case #%d:\n",++cas);
		for(int i=0;i<n;i++)
		{
			int s=order[i];
			if(a[s].p<0||a[s].p>L)
			printf("Fell off\n");
			else
			printf("%d %s\n",a[s].p,dirName[a[s].d+1]);
		}
		printf("\n");
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章