【ブルーブリッジカップ】2018ファイナルチューニングウォッチ(bfs)

トピック:

タイトル説明

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;
}

おすすめ

転載: blog.csdn.net/weixin_45260385/article/details/109319512