usaco-3.2-spin-pass

    模拟题,量不大。

    转动360秒以后,所有轮子回到起始角度。因此如果360秒以后还没有出现重合情况的话,就可以退出循环了。

    如何判断五个轮子重合呢?起初我也没有很好的方法,一个个去判断重合区域实在是太麻烦了。后来想到一个好方法。把 360度的轮子分成360个区域,用整形数组表示,如果一个轮子的缺口在这个区域内,则这个小区域加1,计算5个轮子的所有缺口。然后遍历这个数组,如果 有个区域的值>=5,表明这个区域上面至少有5个缺口,则5个缺口重合,退出循环。

/*
ID: qq104801
LANG: C++
TASK: spin
*/

#include <iostream>
#include <fstream>
#include <bitset>
#include <cstdio>
#include <algorithm>

using namespace std;

#define PI 360
int speed[6];
bitset<PI> curr[6],next[6];

void test()
{    
    freopen("spin.in","r",stdin);
    freopen("spin.out","w",stdout);
    int num,start,end;
    for(int i=1;i<=5;i++)
    {
        cin>>speed[i]>>num;
        for(int j=1;j<=num;j++)
        {
            cin>>start>>end;
            end+=start;
            for(int k=start;k<=end;k++)
                curr[i].set(k%PI);
        }
    }

    int angle=0;
    bool flag;
    while(angle<PI)
    {
        for(int i=0;i<PI;++i)
        {
            flag=false;
            for(int j=1;j<=5;j++)
                if(!curr[j].test(i))
                {
                    flag=true;
                    break;
                }
            if(!flag)
            {
                cout<<angle<<endl;
                return;
            }    
        }
            
        for(int i=1;i<=5;i++)
        {
            for(int j=0;j<PI;j++)
                next[i][j]=curr[i][(j+PI-speed[i])%PI];
            curr[i]=next[i];
        }
        ++angle;
    }
    cout<<"none"<<endl;
 
}

int main () 
{        
    test();        
    return 0;
}

test data:

USACO Training
Grader Results     
9 users online
CHN/3 IND/1 IRN/1 KGZ/1 ROM/1 USA/1 VNM/1

USER: cn tom [qq104801]
TASK: spin
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.005 secs, 3376 KB]
   Test 2: TEST OK [0.019 secs, 3376 KB]
   Test 3: TEST OK [0.032 secs, 3376 KB]
   Test 4: TEST OK [0.019 secs, 3376 KB]
   Test 5: TEST OK [0.003 secs, 3376 KB]
   Test 6: TEST OK [0.016 secs, 3376 KB]
   Test 7: TEST OK [0.008 secs, 3376 KB]
   Test 8: TEST OK [0.030 secs, 3376 KB]

All tests OK.

YOUR PROGRAM ('spin') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.

Here are the test data inputs:

------- test 1 ----
30 1 0 120
180 1 10 100
35 1 20 90
31 1 30 80
32 1 50 60
------- test 2 ----
30 1 350 350
180 1 10 100
35 1 67 23
31 1 30 4
32 1 50 7
------- test 3 ----
180 1 0 120
180 1 120 120
180 1 240 120
31 1 30 4
32 1 50 7
------- test 4 ----
1 1 140 359
1 1 200 359
1 1 4 1
2 1 6 1
1 1 300 300
------- test 5 ----
45 5 140 13 300 17 0 15 20 3 40 1
73 1 200 359
105 2 4 1 50 50
179 3 6 1 8 1 359 3
3 1 300 300
------- test 6 ----
45 5 120 13 200 17 0 15 20 3 32 1
73 5 200 100 1 30 50 10 70 2 75 1
105 2 100 1 50 20
179 3 6 1 8 1 359 3
3 1 300 359
------- test 7 ----
73 5 207 101 1 35 57 11 71 2 75 1
45 5 125 13 200 17 0 15 20 3 32 1
96 5 100 12 50 13 0 2 300 39 250 1
119 5 6 1 8 1 359 1 245 1 123 1
15 5 300 1 231 1 185 1 179 2 0 18
------- test 8 ----
73 5 207 11 1 35 57 11 71 2 75 1
45 5 125 3 200 17 0 15 20 3 32 1
96 5 100 1 50 1 0 2 300 39 250 1
119 5 6 1 8 1 359 1 245 1 123 1
15 5 300 1 231 1 185 1 179 2 0 1

Keep up the good work!
Thanks for your submission!

 

posted on 2014-09-12 00:14  深蓝无忌  阅读(155)  评论(0编辑  收藏  举报

导航