这个题是bfs的应用,我们平常bfs就上下左右四个方向走,这个就是要么+1要么+k,这两个选择,当v[i]全部被记录过的时候,我们的队列就会为空,然后就会退出bfs,这样我们就可以的到从一个数其他所有的数的调整个数,取这个调整个数的数组的最大值就是我们要找的最大值。
#include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std ; const int N = 1e5+10 ; queue<int> q ; int n , k ; int ans ; int cnt ; int d[2] ; bool v[N] ; int dis[N] ;//走到每个数的调整个数 void bfs(){ q.push(0) ; while(!q.empty()){ int now = q.front() ; q.pop() ; for(int i = 0 ; i < 2 ; i ++){//遍历这两个方向 int tx = (now + d[i]) % n ; if(!v[tx]){ v[tx] = 1 ; dis[tx] = dis[now] + 1 ; q.push(tx) ; } } } } int main(){ cin >> n >> k ; d[0] = 1 ; d[1] = k ; memset(v,0,sizeof(v)) ; v[0] = 1 ;//第一个数走过了,不用调 bfs() ; for(int i = 0 ; i < n ; i ++) ans = max(ans,dis[i]) ;//找这个数组的最大值 cout << ans << endl ; return 0 ; }