Codeforces Round #789 (Div. 2)
A - Tokitsukaze and All Zero Sequence
题意:
给定一组数,可以进行以下操作:
任选两个数和
·如果 = , 那么就让他们其中一个变为0.
·否则 = = min(,)
问要将这个数组的元素全变为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的全排列。求满足 < 并且 > 的数组{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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具