一根长度为 L 厘米的木棍上有 n 只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为 1 厘米/秒。当两只蚂蚁相撞时,二者同时调头(掉头用的时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算 T 秒之后每只蚂蚁的位置。

由于掉头用的时间可以忽略不计,所以可以直接看做两只蚂蚁对穿而过。于是可以很开心的直接把坐标按照方向进行加 / 减的处理。得到某只蚂蚁的最终坐标。

把棍子拉为无限长,然后通过模拟这个过程可以发现,蚂蚁的顺序是绝对的,最左边的蚂蚁绝不可能爬到其他蚂蚁的右边去。所以将最终坐标从小到大排序就能够得到这只蚂蚁最终的位置。当然,如果最终蚂蚁的位置坐标小于 0 或者大于 L 那么就直接判断为Fell off。

此外,从题目所给的数据可以看得出,蚂蚁并不是按照顺序输出的,因此用数组存下输入的顺序就OK了。

P.S : 注意每组数据之间有个空行。

附AC代码:

#include <stdio.h>
#include <math.h>
#include <iostream>
#include <cstdarg>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <list>
#include <vector>
#include <map>
long
sizeof(a))
namespace std;
  15:  
int count, ...)
  17: {
  18:     va_list arg_ptr; 
  19:     va_start (arg_ptr, count);
int i = 0; i < count; i++)
int*));
  22:     va_end(arg_ptr);
  23: }
  24:  
struct Ant
  26: {
int id, p, d;
const
  29:     {
return p < x . p;
  31:     }
  32: }Ant;
  33: Ant now[10009], next[10009];
  34:  
int tmp[10009];
  36:  
int main()
  38: {
int T;
, &T);
int cnt = 1; cnt <= T; cnt++)
  42:     {
int l, t, n;
int p, d;
char c;
, cnt);
, &l, &t, &n);
int i = 0; i < n; i++)
  49:         {
, &p, &c);
'L') ? (-1) : (1));
  52:             now[i] = (Ant) {i, p, d};
  53:             next[i] = (Ant) {0, p + t * d, d};
  54:         }
  55:         sort(now, now + n);
int i = 0; i < n; i++)
  57:             tmp[now[i] . id] = i;
  58:         sort(next, next + n);
int i = 0; i < n; i++)
if (next[i] . p == next[i + 1] . p)
  61:                 next[i] . d = next[i + 1] . d = 0;
int i = 0; i < n; i++)
  63:         {
int temp = tmp[i];
if(next[temp] . p < 0 || next[temp] . p > l)
);
else
  68:             {
, next[temp] . p);
);
));
  72:             }
  73:         }
);
  75:     }
return 0;
  77: }

相关文章: