Restore the Array(sb构造)

#include<bits/stdc++.h>
#define endl '\n'
#define deg(a) cout<<#a<<'='<<a<<"\n"
#define de(a) cout<<#a<<'='<<a<<' '
#define all(a) a.begin(),a.end()
#define ff first
#define ss second
#define PII pair<int ,int>
using i64 = long long;
const int N = 1e6+10,INF=0x3f3f3f3f;
using namespace std;
void solve() {
	int n;
	cin>>n;
	int a[n],b[n+1];
	for(int x=1;x<n;x++)cin>>a[x];//正常读入n-1
	b[1]=a[1],b[n]=a[n-1];//两边初始化,
	for(int x=2;x<=n-1;x++){
		b[x]=min(a[x],a[x-1]);//现在缺n-2项
		//每一个x代表筛选这个下标位置的b[]值;
		//这里设x为下标的为(x-1)x,当x=2,为12,3为23;
		//12向1看齐,23向12看齐以此类推;
		//显然b[1]=a[1],b12必定<=b1即a1,b12必定<=a2,此时b2位置正确满足,即max(b1,b12)=a[1];
		//b23必定<=a2,a3,b12<=a1,a2,如果三者间a2最大,应该是无解的;
		//如a1<a2>a3,转为b1,b2,b3,b4::max(b1,b2)=a1,max(b2,b3)=a2,max(b3,b4)=a3;
		//这样不做论证,可假设,b1,b2等的相对大小,分配谁是a1,往后推;
		//结果是不可能出现这种情况;
		//这里考虑中间或最小,若最小两者都为a2,a2,那么max(b12,b23)=a2,满足;
		//中间大小,两者一定一个为a2,一个小于a2,取max还是a2,以此类推之后的;
		//末尾情况与首情况无异;
	}
	for(int x=1;x<=n;x++){
		cout<<b[x];	
		if(x!=n)cout<<' ';
	}
	cout<<endl;
}
int main () {
	ios::sync_with_stdio(0), cin.tie(0);
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题要求计算执行算法的迭代次数,直到能够恢复初始值。我们可以使用深度优先搜索(DFS)来解决这个问题。 中文解释: 1. 首先,我们创建一个数组`visited`,用于记录已经访问过的状态。 2. 然后,我们定义一个辅助函数`dfs`来执行深度优先搜索。这个函数有四个参数:当前状态`state`,初始状态`initial_state`,数组`a`和数组长度`n`。 3. 在`dfs`函数中,我们首先将当前状态添加到已访问集合中,并递归地遍历每个位置i。 4. 对于每个位置i,我们检查是否存在之前记录的状态,使得a等于初始状态的ai。如果存在,则继续递归地执行`dfs`函数。 5. 如果遍历完所有位置i后仍然没有找到满足条件的状态,则返回false。 6. 在主函数中,我们首先记录初始状态,然后调用`dfs`函数进行深度优先搜索,并返回迭代次数。 下面是对应的C++代码实现: ```cpp #include <iostream> #include <vector> int iterations = 0; bool dfs(std::vector<int>& state, std::vector<int>& initial_state, std::vector<int>& a, int n) { if (state == initial_state) { return true; } if (iterations > n) { return false; } iterations++; for (int i = 0; i < n; i++) { if (state[i] != a[i] && state[a[i] - 1] == a[i]) { std::swap(state[i], state[a[i] - 1]); if (dfs(state, initial_state, a, n)) { return true; } std::swap(state[i], state[a[i] - 1]); } } return false; } int main() { int n; std::cin >> n; std::vector<int> a(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; } std::vector<int> state(a); std::vector<int> initial_state(a); iterations = 0; dfs(state, initial_state, a, n); std::cout << iterations << std::endl; return 0; } ``` 请注意,这只是一个基本的实现示例,并未进行错误处理和输入验证。在实际应用中,您可能需要根据实际情况进行更多的输入检查和错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值