生命不息,奋斗不止

题解 CF1560B 【Who's Opposite?】

2021-08-19 08:31:36


思路

我们可以通过 $a$ 和 $b$ 或任意两个相对面人的编号求出圈内的人的个数。

我们可以试着画图找规律。

从图中可发现:

  • $i$ 和 $j$ 上面的数字个数为 $j-i+1$ ,而由于他们两两看着对方, $i$ 和 $j$ 下面的数字个数也为 $j-i+1$ 。因此圈内人数 $n$ 为 $2 + 2(b - a - 1)$ 。
  • 每两个相互对视的人编号差为 $\dfrac{n}{2}$ 。

因此我们只需知道 $c$ ,解就是 $(c+\dfrac{n}{2})\mod n $ 。但如果计算得 0 ,则输出 $n$ 。

对于 $a$ ,$b$ 和 $c$ , 如果其中任何一个不在 $n$ 的范围内,就无解,输出 -1 。这一结论亦通过找规律可得。

代码

#include<bits/stdc++.h>
#define debug cout << "Helloworld" << endl
using namespace std;

int main() {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        int a, b, c;
        cin >> a >> b >> c; 
        if(b < a) swap(a, b); //维持 b > a
        int n = 2 + (b - a - 1) * 2;
        if(n < max(a, max(b, c))) cout << -1 << endl;
        else if((c + n / 2) % n == 0) cout << n << endl;
        else cout << (c + n / 2) % n << endl;
    }
    return 0;
}