您的位置:首页 > 新闻 > 资讯 > 【2024蓝桥杯/C++/B组/传送阵】

【2024蓝桥杯/C++/B组/传送阵】

2024/12/23 20:30:54 来源:https://blog.csdn.net/m0_73669127/article/details/140794489  浏览:    关键词:【2024蓝桥杯/C++/B组/传送阵】

题目

问题代码

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
int n;
int porter[N];
int ans;
int sign[N];
bool used;void dfs(int now, int cnt)
{if(sign[now] && used){ans = max(ans, cnt);return;}if(!sign[now]){cnt++, sign[now] = 1; dfs(porter[now], cnt);}if(!used){used = true;dfs(now-1, cnt);dfs(now+1, cnt);used = false;}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1; i <= n ; i++) cin >> porter[i];for(int i = 1; i <= n; i++) dfs(i, 0);cout << ans;return 0;
}

分析

修改

我想了一下,可能是由于回溯的问题。因为我定的是全局变量sign和used,所以回溯应该要逐个回溯。而且我还忘了边界限制。修改如下

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
int n;
int porter[N];
int ans;
int sign[N];
bool used;void dfs(int now, int cnt)
{if(sign[now] && used){ans = max(ans, cnt);return;}if(!sign[now]){cnt++, sign[now] = 1; dfs(porter[now], cnt);sign[now] = 0;}if(!used){sign[now] = 1;used = true;if(now-1 >= 1) dfs(now-1, cnt);//used = false;//sign[now] = 0;sign[now] = 1;used = true;if(now+1 <= n) dfs(now+1, cnt);used = false;sign[now] = 0;}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1; i <= n ; i++) cin >> porter[i];for(int i = 1; i <= n; i++) dfs(i, 0);cout << ans;return 0;
}

再分析

可以看出原本不过的样例过了。说明修改可能正确了,但是因此也增加了时间消耗。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com