按照题目意思模拟……
而且因为旋转360度一定会重复,所以只要模拟旋转360次,每次CHECK一下是否符合要求即可。
Executing... Test 1: TEST OK [0.003 secs, 3364 KB] Test 2: TEST OK [0.005 secs, 3364 KB] Test 3: TEST OK [0.005 secs, 3364 KB] Test 4: TEST OK [0.005 secs, 3364 KB] Test 5: TEST OK [0.003 secs, 3364 KB] Test 6: TEST OK [0.005 secs, 3364 KB] Test 7: TEST OK [0.003 secs, 3364 KB] Test 8: TEST OK [0.005 secs, 3364 KB] All tests OK.
/*
TASK:spin
LANG:C++
*/
#include <iostream>
#include <cstdio>
using namespace std;
int v[5];
bool aaa[5][360]={0}, bbb[5][360];
bool (*x)[360] = aaa, (*y)[360] = bbb;
inline bool check()
{
for (int i = 0; i != 360; ++ i)
{
int flag = 0;
for (int j = 0; j != 5; ++ j) flag += x[j][i];
if (flag == 5) return true;
}
return false;
}
int main()
{
freopen("spin.in","r",stdin);
freopen("spin.out","w",stdout);
for (int i = 0; i != 5; ++ i)
{
cin >> v[i];
int t;
cin >> t;
while (t--)
{
int st, len;
cin >> st >> len;
for (int j = 0; j <= len; ++ j) x[i][(j + st)%360] = 1;
}
}
int flag = -1;
for (int t = 0; t != 360; ++ t)
{
if (check())
{
flag = t;
break;
}
for (int i = 0; i != 360; ++ i)
for (int j = 0; j != 5; ++ j)
{
int tmp = i - v[j];
tmp < 0 ? tmp += 360 : tmp;
y[j][i] = x[j][tmp];
}
swap(x, y);
}
if (flag != -1) cout<< flag << endl;
else cout<< "none" << endl;
return 0;
}