题意:在这个题中。给了你竹竿的长度L,给了你蚂蚁的个数n,然后下边n行是每一只蚂蚁的初始位置。问你在T秒之后每一只蚂蚁的位置。
这个题给的时间是3000ms,如果一直要写模拟的话,有点烦人。其实,做这道题的时候,我们可以参考挑战书上的一道Ants题。当两只蚂蚁碰撞之后,我们可以将它看为互穿而过,只不过是要改变位置标记。其实,在这道题中,我们可以发现,蚂蚁在同时间是同时进行运动的。那么,它们的相对位置是不会发生改变的。那么,我们就可以对它进行排序。然后记录它的位置。
接下来举几个列子 让大家深刻了解一下
10 2 4
1 R
5 R
3 L
10 R
|__*__|__*__|__*__|__|__|__|__* //将已有位置进行了星号标记
0 1 2 3 4 5 6 7 8 9 10
-> <- -> ->
我们可以有上图得到 在2秒之后的具体分布情况
|__*__|__*__|__|__|__*__|__|__| ....第4只蚂蚁掉下 //将到达位置进行了星号标记
0 1 2 3 4 5 6 7 8 9 10
<- -> ->
我们可以看到,在1 3 走了一秒之后,它们发生了碰撞。使得1和3掉头继续行走。
其实,我们可以换一种思路。当1和3发生碰撞时,我们可以将其视为互穿而过。此时,我们只需交换1和3的位置标记
在上边这个例子中(没有开始走之前),我们按照位置排序之后它的id编号变为 0 2 1 3
那么,我们就可以用一个order数组来记录变换之后的蚂蚁的位置。进而通过变换后的数组来输出每个蚂蚁的位置。
可能字面意思说的不太清楚。大家可以看下边的代码。进行理解。(主要理解它的相对位置不会发生改变。然后用一个order来记录位置)。
代码:
#include<set>
#include<map>
#include<stack>
#include<bitset>
#include<math.h>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll;
const int MAX_N=1000000+50;
const int INF=0x3f3f3f3f;
const double EPS = 1e-10;
ll mod = 1e9+7;
struct ant{
int id;
int pow;
int dir;
bool operator < (const ant &a)const{
return pow<a.pow;
}
//结构体内部定义排序
}before[MAX_N],after[MAX_N];
int order[MAX_N]; //之前的位置记录
char Rlt[][10] = {"L","Turning","R","Fell off"};
int main(){
int t;
scanf("%d",&t);
int L,T,n,k = 1;
while(t--){
printf("Case #%d:\n",k++);
scanf("%d%d%d",&L,&T,&n);
int pow;
char c;
for(int i = 0; i < n ; i++){
scanf("%d %c",&pow,&c);
int dir = (c == 'L'?-1:1);
before[i] = (ant){i,pow,dir};
after[i] = (ant){0,pow + T * dir,dir};
}
sort(before,before+n);
sort(after,after+n);
for(int i = 0; i < n; i++){
order[before[i].id] = i;
}
for(int i = 0; i < n - 1; i++){
if(after[i].pow == after[i+1].pow) after[i].dir = after[i+1].dir = 0;
}
for(int i = 0; i < n; i++){
int a = order[i];
if(after[a].pow < 0 || after[a].pow > L) printf("%s\n",Rlt[3]);
else printf("%d %s\n",after[a].pow,Rlt[after[a].dir + 1]);
}
printf("\n");
}
return 0;
}
/*
********
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
*/