题目传送门
题意 两个人逆时针绕长度为L的圈跑,并在n个点停留。由于起点不一样,所以到达这n个点的距离不一样,现在给定这两个人先后到达这n个点的距离,判断两人是否绕同一个圈跑。 Consider an example. Let L = 8, blue points are barriers, and green points are Kefa’s start (A) and Sasha’s start (B). Then Kefa writes down the sequence[2, 4, 6], and Sasha writes down [1, 5, 7].
思路 虽然起点不一样,但如果是同一个圈的话,这n个点的相对位置是一样的,既任意两点的最短距离一致。
代码 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#define READ(x) scanf("%d" ,&x)
#define READLL(x) scanf("%lld" ,&x)
#define LL long long
#define MAXN
using namespace std ;
int dis1[5000 ];
int dis2[5000 ];
int cnt1,cnt2;
int n;
int L;
int num[60 ];
int main () {
int flag;
int q;
while (cin >>n>>L){
cnt1 = cnt2 = 0 ;
flag = 0 ;
for (int i = 1 ;i <= n;i++) READ(num[i]);
for (int i = 1 ;i <= n;i++){
for (int j = i+1 ;j <= n;j++){
q = min(abs (num[i]-num[j]),L-abs (num[i]-num[j]));
dis1[++cnt1]=q;
}
}
for (int i = 1 ;i <= n;i++) READ(num[i]);
for (int i = 1 ;i <= n;i++){
for (int j = i+1 ;j <= n;j++){
q = min(abs (num[i]-num[j]),L-abs (num[i]-num[j]));
dis2[++cnt2]=q;
}
}
sort(dis1,dis1+cnt1+1 );
sort(dis2,dis2+cnt2+1 );
for (int i = 1 ;i<=cnt1;i++){
if (dis1[i]!=dis2[i]){
flag = 1 ;
break ;
}
}
if (flag)
cout <<"NO" <<endl ;
else
cout <<"YES" <<endl ;
}
return 0 ;
}