【蓝桥杯】1224. 交换瓶子*(模拟)

穿越隧道

yeah!
纯模拟

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 1e5 + 10;
bool st[N];
int n;
struct node{
	int idx;
	int v;
}a[N];

int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i].v;
		a[i].idx = i;
	}
	int cnt = n,ans = 0, flag = 0;
	while(cnt > 0){
		for(int i = 1; i<= n; i++){
			if(a[i].v == i){
				if(!st[a[i].v]){
					cnt--;
					st[a[i].v] = true;
				}
				if(cnt == 0){
					flag = 1;
					break;
				} 
			}
			else if(a[i].v == a[a[i].v].idx && a[a[i].v].v == a[i].idx && !st[a[i].v]){
				cnt -= 2;
				int val1 = a[i].v, val2 = a[val1].v;
//				cout << val1 <<" " << val2 << endl;
				st[val1] = true;
				st[val2] = true;
				ans++;
				//printf("11.a[%d].v=%d,a[a[%d].v].v = %d\n,ans = %d\n",i,a[i].v,i,a[a[i].v].v,ans);
				swap(a[i].v,a[a[i].v].v);
				//printf("22.a[%d].v=%d,a[a[%d].v].v = %d\n,ans = %d\n",i,a[i].v,i,a[a[i].v].v,ans);
				if(cnt == 0){
					flag = 1;
					break;
				} 
	 		}
	 		else{
	 			st[a[i].v] = true;
	 			swap(a[i].v,a[a[i].v].v);
	 			cnt--;
	 			ans++;
				 if(cnt == 0){
				 	flag = 1;
				 	break;
				 }
	 		}
		}
		if(flag) break;
	}
	//for(int i = 1; i <= n; i++){
//		cout << a[i].v <<" " << a[i].idx << endl;
//	}
	cout << ans << endl;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值