描述
一个圆形花圃被分为k个扇形区域(0,1,…,k-1)。有两只小鼹鼠A,B分别位于其中的两个区域。鼹鼠从一个扇形区域移动到相邻的区域需要1分钟。已知A鼹鼠总是沿顺时针方向移动(序号增大),B鼹鼠总是沿逆时针方向移动(序号减小),两只鼹鼠都是每隔一段时间钻出地面一次。请你求出两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间。如果永远遇不到,则输出“no answer”。
输入
第一行为一个整数k,表示扇形区域的个数。1 <= k< = 10000
第二行为两个整数la,lb分别表示两只鼹鼠初始时所处的位置。0 <= la, lb < k。
第三行为两个整数ia,ib分别为两只鼹鼠钻出地面的间隔时间。0 < ia, ib < 100。
第四行为两个整数fa,fb分别为两只鼹鼠第一次钻出地面的时间。0 <= fa < ia, 0 <= fb < ib。
输出
用一个整数表示两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间。
若两只鼹鼠永远无法相遇,输出“no answer”。
样例输入
7
1 5
3 5
1 2
样例输出
37


1 #include <cstdio>
2 #include <cstring>
3 #include <memory.h>
4 #include <algorithm>
5 #include <stdlib.h>
6 #include <math.h>
7 #include <iostream>
8 #include<queue>
9 #include <vector>
10 #include <bitset>
11 using namespace std;
12
13 int k;
14 int sa, sb, gapa, gapb, ta1st, tb1st;
15 bool iif[10010] = { 0 };
16 int t;
17
18 void judge() {
19 if (ta1st >= tb1st) {
20 for(int i=ta1st;i<13000;i+=gapa)
21 if ((i - tb1st) %gapb== 0) {
22 t = i;
23 break;
24 }
25 }
26 else
27 for (int i = tb1st; i<13000; i += gapb)
28 if ((i - ta1st) %gapa== 0) {
29 t =i;
30 break;
31 }
32 if (t == 0 && ta1st*tb1st != 0)
33 {
34 printf("no answer\n");
35 return;
36 }
37 int _sa = sa, _sb = sb;
38 sa += t, sb -= t;
39 bool flag = false;
40 int gap = gapa;
41 for (;; gap += gapa) {
42 if (gap%gapb == 0)
43 break;
44 }
45 int tmp = sa - sb;
46 tmp %= k;
47 for (;; t += gap) {
48 if (tmp==0) {
49 flag = true;
50 break;
51 }
52 if (iif[tmp])
53 break;
54 iif[tmp] = 1;
55 tmp += (2 * gap)%k;
56 tmp %= k;
57 }
58 if (flag)
59 printf("%d\n", t);
60 else
61 printf("no answer\n");
62 }
63
64 int main()
65 {
66 scanf("%d%d%d%d%d%d%d", &k, &sa, &sb, &gapa, &gapb, &ta1st, &tb1st);
67 judge();
68 return 0;
69 }
TLE不TLE的好迷
考前大脑宕机了
现在也不想看
来源:oschina
链接:https://my.oschina.net/u/4387108/blog/3921461