ABC350

学贵坚持發表於2024-04-30

A

link

把最後三位取成數字,判斷是否小於\(349\),大於\(1\),不等於\(316\)

點選檢視程式碼
#include<bits/stdc++.h>

using namespace std;

char s[10];
int ans;

signed main(){
	
	cin >> s+1;
	ans += s[4]-48;
	ans *= 10;
	ans += s[5]-48;
	ans *= 10;
	ans += s[6]-48;
	
	if(ans >= 1&&ans <= 349
	&&ans != 316) cout << "Yes";
	else cout << "No";
	
	return 0;
	
} 

B

link

用一個陣列存每個牙是不是還在,模擬即可。

點選檢視程式碼
#include<bits/stdc++.h>

using namespace std;

int n,q;
int ans;
int a[1005];

signed main(){
	
	cin >> n >> q;
	
	while(q--){
		int x;
		cin >> x;
		if(a[x]) a[x] = 0,ans--;
		else a[x] = 1,ans++;
	}
	
	cout << n-ans;
	
	return 0;
	
}

C

link

由於沒有要求最小次數,第\(i\)次只需要把\(i\)這個數字換到\(i\)這個位置,用一個陣列存\(i\)這個數字當前在哪個位置。

點選檢視程式碼
#include<bits/stdc++.h>

using namespace std;

int n;
int a[200005];
int ans;
int l[200005],r[200005];
int mp[200005];

signed main(){
	
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i],mp[a[i]] = i;
	
	for(int i = 1;i <= n;++ i){
		if(a[i] != i){
			ans++;
			int t = mp[i];
			swap(mp[a[i]],mp[i]);
			swap(a[i],a[t]);
			l[ans] = i,r[ans] = t;
		}
	}
	
	cout << ans << endl;
	for(int i = 1;i <= ans;++ i)
		cout << l[i] << " " << r[i] << endl;
	
	return 0;
	
}

相關文章