10.31T3 其他算法思想

T1 蚂蚁移动

(move.cpp/c)

【问题描述】

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

【输入格式】

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

【输出格式】

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

【样例输入】

 5 5 
 2 
 2 D 
 4 L
【样例输出】

1 3

两只蚂蚁相碰等于穿过,就完了

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[80000],tot;
 7 int main() {
 8     int L,T;
 9     cin>>L>>T;
10     int n;
11     cin>>n; 
12     T%=2*L;
13     for(int i=1; i<=n; i++) {
14         int pos;
15         char d;
16         cin>>pos>>d;
17         if(d=='L') {
18             a[++tot]=abs(pos-T);
19             if(a[tot]>L)a[tot]-=2*(a[tot]-L);
20         } else {
21             a[++tot]=pos+T;
22             if(a[tot]>L)a[tot]-=2*(a[tot]-L);
23             if(a[tot]<0)a[tot]=-a[tot];
24         }
25     }
26     sort(a+1,a+tot+1);
27     for(int i=1;i<=tot;i++)cout<<a[i]<<" ";
28     return 0;
29 }

over

原文地址:https://www.cnblogs.com/saionjisekai/p/9884072.html