トピック:
タイトル説明
Xiao Mingは、ハイエンドのハイエンド電子時計を購入しました。彼は時間を調整しようとしています。
M78星雲では、時間の測定単位が地球とは異なります。M78星雲の1時間はn分です。
時計には現在の数字を1つ増やすためのボタンが1つしかないことは誰もが知っています。分を調整するとき、現在表示されている数字が0の場合、ボタンを押すと1に変わり、もう一度押すと2に変わります。現在の番号がn-1の場合、1回押すと0になります。
強迫性障害の患者として、シャオミンは時計の時刻を調整する必要があります。時計の時刻が現在の時刻より1多い場合、正しい時刻に戻るにはプラスワンボタンをn-1回押す必要があります。
Xiao Mingは、時計が別のボタンを追加できる場合、それは現在の数字にkを追加することを意味する
と考えました...彼は知りたいのですが、この+ kボタンがある場合は、最適な戦略に従ってボタンを押して、任意の分からもう1分間に押す最大回数。
+ kボタンを押したときに、kを加算した後の数がn-1を超えると、nはnを法とすることに注意してください。
たとえば、n = 10およびk = 6の場合、現在の時刻が0であると仮定して、+ kボタンを2回押して2に調整します。
入る
2つの整数n、kは、タイトルと同じ意味を持ちます。
0 <k <n <= 100000
出力
1行に1つの整数とは、最適な戦略に従ってキーを押すこと、およびある時間から別の時間に押す最大回数を意味します。
サンプル入力
5 3
サンプル出力
2
促す
時間が正しい場合は、0回押します。それ以外の場合、押される回数と一連の操作の関係は次のとおりです
。1:+1
2:+ 1、+ 1
3:+3
4:+ 3、+ 1
コード:
bfsの特性によると、最初に到着するのは最短である必要があり、ワイド検索を実行します。
0からn-1までのこれらのポイントで最短のステップ数を見つけてから、これらのステップで最大のステップ数を見つけることが答えです。
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn=100020;
ll n,k,ans=0,dis[maxn];
bool vis[maxn]={
false};
void bfs()
{
queue<int> q;
fill(dis,dis+maxn,0); //初始化为0
vis[0]=1;
q.push(0);
while(!q.empty())
{
int p = q.front();
q.pop();
ans = max(ans,dis[p]);
int x=(p+1)%n; //超过n-1就取余n
if(!vis[x]) //没到过
{
q.push(x);
dis[x]=dis[p]+1;
vis[x]=1; //记录到过
}
int y=(p+k)%n; //超过n-1就取余n
if(!vis[y])
{
q.push(y);
dis[y]=dis[p]+1;
vis[y]=1; //记录到过
}
}
}
int main()
{
cin>>n>>k;
bfs();
cout<<ans;
return 0;
}