USACO training->3.2 Spinning Wheels

题目来源:usaco training

  这是一个模拟题。题目较长,不太容易理解意思,尤其对于本人这种四级还没过的菜b。给你5个轮子,每个轮子有一个转动的速度,和不多于5个空隙。每个空隙给出一个起始角度和空隙的大小(用一个角度表示,这里我是拿google翻译extent了这个词才明白的,不然样例都没看懂)。如果明白了题目意思就能简单不少了。因为不管轮子转动的速度是多少,最多转动360s以后肯定也会回到原点了(v*360%360==0)。所以枚举转动时间即可。

View Code
 1 /*
2 ID: like_091
3 PROG: spin
4 LANG: C++
5 */
6 #include <iostream>
7 #include <cstdio>
8 #include <cstdlib>
9 #include <ctime>
10 #include <map>
11 #include <fstream>
12 #include <vector>
13 #include <cmath>
14 #include <algorithm>
15
16 using namespace std;
17
18 struct node{
19 int w;
20 int v;
21 int s[6], e[6];
22 };
23
24 node p[5];
25
26 bool cross(){
27
28 int i, j, k;
29
30 for (i=0; i<360; i++){
31 bool flag = true;
32 for (j=0; j<5; j++){
33 bool temp = false;
34 for (k = 0; k < p[j].w; k++)
35 {
36 if (p[j].s[k] > p[j].e[k])
37 {
38 if (i >= p[j].s[k] || i <= p[j].e[k])
39 temp = true;
40 }
41 else if (i >= p[j].s[k] && i <= p[j].e[k])
42 temp = true;
43 if (temp)break;
44 }
45 if (!temp)flag = false;
46 if (!flag)break;
47 }
48 if (flag){
49 cout<<i<<endl;
50 return true;
51 }
52 }
53 return false;
54 }
55
56
57 int main(){
58
59 ifstream cin("spin.in");
60 ofstream cout("spin.out");
61
62 int i, j, k, sum;
63
64 for (i=0; i<5; i++){
65 cin>>p[i].v>>p[i].w;
66 for (j=0; j<p[i].w; j++){
67 cin>>p[i].s[j]>>p[i].e[j];
68 p[i].e[j] = (p[i].s[j]+p[i].e[j]) % 360;
69 }
70 }
71
72 sum = 0;
73
74 if (cross())cout<<sum<<endl;
75 else {
76 bool flag = true;
77
78 for (i = 0; i < 360; i++){
79 sum++;
80 for (j = 0; j < 5; j++){
81 for (k = 0; k < p[j].w; k++){
82 p[j].s[k] = (p[j].s[k] + p[j].v) % 360;
83 p[j].e[k] = (p[j].e[k] + p[j].v) % 360;
84 }
85 }
86 if (cross()){
87 cout<<sum<<endl;
88 flag = false;
89 break;
90 }
91 }
92 if (flag)cout<<"none"<<endl;
93 }
94 return 0;
95 }
posted @ 2011-08-20 13:14  like@neu  阅读(378)  评论(0编辑  收藏  举报