SGU188 解题手记
  对于任意两个巡逻方向不同的人,都能很容易地求出他们在T时间以内碰面多少次。
  首先算出这两个人在T之间之内一共能跑多远,然后求出两人最初位置的距离(在和速度的方向上),如果两人T之间之内跑得路程大于最初位置的距离,那么至少相遇一次,用两人T之间之内跑得路程除以1000求得总共相遇几次。
  Submit 1: WA on 7。当两人恰好在T时刻第1次相遇时,算错了。
  Submit 2: AC。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
using namespace std;
 
inline int sgn(int x) { return x>0?1:-1; }
inline int abs(int x) { return x>0?x:-x; }
 
int main()
{
    int l[20],v[20],meet[20]={};
    int n,t;
    scanf("%d%d",&n,&t);
    for (int i=0;i<n;++i) scanf("%d",l+i);
    for (int i=0;i<n;++i) scanf("%d",v+i);
    for (int i=0;i<n;++i)
        for (int j=i+1;j<n;++j) if (v[i]*v[j]<0)
        {
            int dis=(l[i]-l[j])*sgn(v[j]);
            if (dis<0) dis+=1000;
            int total=t*(abs(v[i])+abs(v[j]))-dis;
            int times=total>=0?1+total/1000:0;
            meet[i]+=times; meet[j]+=times;
        }
    for (int i=0;i<n;++i) printf("%d ",meet[i]);
    return 0;
}