Codeforces Round #789 (Div. 2)

A - Tokitsukaze and All Zero Sequence

题意:

给定一组数,可以进行以下操作:
任选两个数aiaj
·如果 ai = aj, 那么就让他们其中一个变为0.
·否则 ai = aj = min(ai,aj)
问要将这个数组的元素全变为0,至少需要多少次这样的操作?

思路:如果说这个数组里本来就有0,那么我们可以一直利用这个0去改变其他非0的元素。如果这个数组里原本没有0,但是却有相同的数,那么我们可以通过将这两个相同的数其中一个变为0,然后再利用这个0去改变其他元素的值。如果既没有0又没有相同的数,那么我们就只能随机找一对数,把这两个数变为相等的然后再让其中一个变为0,然后再利用这个0去改变其他元素的值。

出现的问题:当时审题不清,考虑的是相邻的相等的,导致wa的两次,只能说自己太出现大意了。要改!

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 110;
int w[N];
 
void solve() {
	int n;
	cin >> n;
	for(int i = 0; i < n; i++) cin >> w[i];
	int flag = 0;
	int cnt = 0;
	for(int i = 0; i < n; i++) {
		for(int j = i + 1; j < n; j++) {
			if(w[i] == w[j]) {
				flag = 1;
				break;
			}
		}
	}
	for(int i = 0; i < n; i++) {
		if(w[i] == 0) cnt++;
	}
	if(cnt > 0) cout << n - cnt << endl;
	else {
		if(flag) cout << n << endl;
		else cout << n + 1 << endl;
	}
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
}

B1 - Tokitsukaze and Good 01-String (easy version)

题意:

给定一组由0,1组成的数组,对于这样的数组,我们可以把他分成若干子段,但是要求该数组满足:该数组的子段的所有元素必须相等,该子段长度必须为偶数。 我们可以进行一个操作:对于任意位置的数,我们可以将其变为0或1。问最少结果多少次操作可以将给出的数组变为符合要求的数组?

思路:

贪心。遇到奇数相等的,那么就让最后一个变为"相反"的数,一直弄下去,就搞定了。

遇到的问题: 想到了思路,但是实现代码的速度还是太慢了。要提升上去。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 1100;
int w[N];
 
void solve() {
	int n;
	cin >> n;
	string s;
	cin >> s;
	char t = s[0];
	int k = 1;
	int ans = 0;
	for(int i = 1; i < s.size(); i++) {
		if(s[i] == t) k++;
		else {
			if(k % 2) {
				ans++;
				t = s[i];
				k = 1;
				i--;
			}else {
				t = s[i];
				k = 1;
			}
		}
	}
	cout << ans << endl;; 
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 

B2 - Tokitsukaze and Good 01-String (hard version)

题意:在B1的基础上,要求在求出最少分段数。

思路:经过B1的处理后,所有的01,10都将变为11或00,这是可以变化的,所以我们不用考虑这种情况,我们需要考虑的是11和00这两种,枚举,当后面的一对不等于前面的一对,则分段。最后对于分了几段,假如我们分了两次,那么就是分了三段,所以最终答案等于所得加1

代码:

没改进:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
 
void solve() {
	int n;
	cin >> n;
	string s;
	cin >> s;
	char t = s[0];
	int k = 1;
	int ans = 0;
	for(int i = 1; i < s.size(); i++) {
		if(s[i] == t) k++;
		else {
			if(k % 2) {
				ans++;
				t = s[i];
				k = 1;
				i--;
			}else {
				t = s[i];
				k = 1;
			}
		}
	}
	cout << ans << ' '; 
	ans = 0;
	char pre = '2';
	for(int i = 0; i < n; i += 2) {
		if(s[i] != s[i+1]) continue;
		if(s[i] != pre) {
			ans++;
		}
		pre = s[i];
	}
	cout <<max(1ll, ans) << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
}

改进后:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
 
void solve() {
	int n;
	cin >> n;
	string s;
	cin >> s;
	int ans = 0, cnt = 0;
	char pre = '2';
	for(int i = 0; i < n; i += 2) {
		if(s[i] != s[i+1]) cnt++;
		else if(s[i] != pre) {
			ans++;
			pre = s[i];
		}
	}
	cout << cnt << ' ' << max(1ll, ans) << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
}

C - Tokitsukaze and Strange Inequality

题意:

给定一个数组,该数组的1-n的全排列。求满足pa < pc 并且 pb > pd的数组{a,b,c,d}的个数。

思路: 可以通过枚举b,c。那么问题就变成了 求1~n中小于P[b] 并且 1 ~n 中 小于p[c]的情况;我们可以先预处理出b从1~n的每一种位置的a的d的情况,从而以O(n^2)的时间复杂度求出答案。不过要取long long

dp[i][j]: 区间[1,i]中个小于等于j的个数
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N = 5010;
int w[N];
int dp[N][N];
 
void solve() {
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> w[i];
	}
	for(int i = 1; i <= n;	 i++)
		for(int j = 1; j <= n; j++)
			dp[i][j] = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) dp[i][j] += dp[i-1][j];
		for(int j = w[i]; j <= n; j++) dp[i][j]++;
	}
	int ans = 0;
	for(int b = 1; b <= n; b++) {
		for(int c = b + 1; c <= n; c++) {
			ans += dp[b-1][w[c] - 1] * (dp[n][w[b] - 1] - dp[c][w[b] - 1]);
		}
	}
	cout << ans << endl;
}
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
}

posted @   飘向远方丶  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示