SGU 188 解题手记
对于任意两个巡逻方向不同的人,都能很容易地求出他们在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; } |
