(暴力枚举) $O(360 * 360 * 5)$
圆盘以360秒为周期。
第i秒第k个圆盘所旋转的角度为 $i * v_k$ 。
第360秒第k个圆盘所旋转的角度为$360 * v_k$ 由于是360的倍数。那么圆盘所转的角度 % 360 与第0秒所转的角度相同。 所以是360 秒为一个周期。
st[i][j]
表示第i个圆盘,角度为j 是否是缺口。
枚举: 先枚举时间360秒, 然后枚举360度,再判断5个圆盘该角度是否有缺口。
所以时间复杂度$O(360 * 360 * 5)$
C++ 代码
#include <iostream>
using namespace std;
const int N = 360;
int v[5];
bool st[5][N];
int main()
{
for (int i = 0; i < 5; i ++)
{
cin >> v[i];
int n;
cin >> n;
while (n --)
{
int start, len;
cin >> start >> len;
for (int j = start; j <= start + len; j ++)
st[i][j % N] = true;
}
}
for (int i = 0; i < N; i ++)
for (int j = 0; j < N; j ++)
{
bool flag = true;
for (int k = 0; k < 5; k ++)
{
int x = j - i * v[k];
x = (x % N + N) % N;
if (!st[k][x])
{
flag = false;
break;
}
}
if (flag)
{
cout << i << endl;
return 0;
}
}
puts("none");
return 0;
}
没看懂
x = (x % N + N) % N;
为什么要%两次?