ABC350

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;
	
}

D

link

首先有一个特点,如果把人看成点,关系看成边,那么每一个连通块任意两点间都可以连边,有\(\frac{n(n-1)}{2}\)条边(\(n\)为点数)。
求出有多少联通块以及每个联通块中点的个数即可,把每个联通块可以连的边数加起来,减去现有的边数即可。

点击查看代码
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n,m;
vector<int> ed[200005];
int cn,ans;
bool vs[200005];

void dfs(int x){
	cn++;
	for(int i = 0;i < ed[x].size();++ i){
		int j = ed[x][i];
		if(!vs[j]) vs[j] = 1,dfs(j);
	}
}

signed main(){
	
	cin >> n >> m;
	for(int i = 1;i <= m;++ i){
		int x,y;
		cin >> x >> y;
		ed[x].push_back(y);
		ed[y].push_back(x);
	}
	
	for(int i = 1;i <= n;++ i){
		if(vs[i]) continue;
		cn = 0;
		vs[i] = 1;
		dfs(i);
		ans += cn*(cn-1)/2;
	}
	
	ans -= m;
	cout << ans;
	
	return 0;
	
} 
posted @ 2024-04-30 21:54  学贵坚持  阅读(7)  评论(0编辑  收藏  举报