两只鼹鼠

来源:互联网 发布:2017全明星赛 数据 编辑:程序博客网 时间:2024/04/29 22:31
总时间限制: 
1000ms 
内存限制: 
65536kB
描述

一个圆形花圃被分为k个扇形区域(0,1,…,k-1)。有两只小鼹鼠AB分别位于其中的两个区域。鼹鼠从一个扇形区域移动到相邻的区域需要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”。
样例输入
71 53 51 2
样例输出
37



先找出他们碰头的时间,然后去询问这段时间他们是否同时出头


#include <iostream>#include <cstring>using namespace std;int n;int la,lb;int ia,ib;int fa,fb;int a[10000];int judge(){    int lq, xq;    if(n%2==0)    {        lq=(lb-la+n)%n;        if(lq%2!=0)return -1;        lq=lq/2;        xq=n/2;    }    else    {        lq=(lb-la+n)%n;        if(lq%2==0)lq=lq/2;        else lq=(lq+n)/2;        xq=n;    }  //  cout<<lq<<" "<<xq<<endl;  int sum=0;    while(1)    {        int t1=(lq-fa)%ia;        int t2=(lq-fb)%ib;        //    cout<<lq<<"--"<<t1<<" "<<t2<<endl;        if(t1==t2&&t1==0)            return lq;        lq+=xq;       // cout<<a[t1]<<endl;        if(a[t1]==t2)return -1;        a[t1]=t2;        sum++;        if(sum>900000)return -1;    }}int main(){    cin>>n;    cin>>la>>lb;    cin>>ia>>ib;    cin>>fa>>fb;   for(int i=0;i<n;i++)    a[i]=-1;    int s=judge();    if(s>=0)        cout<<s<<endl;        else            cout<<"no answer"<<endl;    return 0;}


0 0
原创粉丝点击