题集链接

A. Tokitsukaze and All Zero Sequence

题意

Tokitsukaze 有一个长度为 n 的序列 a。 对于每个操作,她选择两个数字 ai 和 aj (i≠j; 1≤i,j≤n)。

如果 ai=aj,则将其中之一更改为 0,否则将它们都更改为 min(ai,aj)。

Tokitsukaze 想知道将序列中的所有数字变为 0 的最小操作次数。可以证明答案总是存在的。

思路

由题意可知

如果 a 中含有 0 只要把所以非零数和 0 进行比较就可以了,需要操作的次数为非 0 数的个数。

如果 a 中没有 0 但是有两个相同的数,操作数为 n

如果 a 中没有相同的数,操作数为 n+1

代码

#include <bits/stdc++.h>
using namespace std; void solve()
{
int n;
cin >> n;
map<int, int> ma;
for (int i = 1; i <= n; i++)
{
int a;
cin >> a;
ma[a]++;
}
if (ma[0] > 0)
{
cout << n - ma[0] << endl;
return;
}
for (auto x : ma)
{
if (x.second >= 2)
{
cout << n << endl;
return ;
}
}
cout << n + 1 << endl;
} int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}

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

题意

这是问题的简单版本。两个版本之间的唯一区别是,较难的版本额外要求最小数量的子段。

Tokitsukaze 有一个二进制字符串s长度n,仅由0和1组成,n是偶数。

现在Tokitsukaze s成最小数量的连续子段,并且对于每个子段,每个子段中的所有数都是相同的。之后,s如果所有子段的长度都是偶数,则认为是好的。

例如,如果ss为“ 11001111 ”,将分为“ 11 ”、“ 00 ”和“ 1111 ”。它们的长度是2,2,4分别是偶数,所以“ 11001111 ”是好的。

另一个例子,如果s为“ 1110011000 ”,将分为“ 111 ”、“ 00 ”、“ 11 ”和“ 000 ”,它们的长度分别为3,2,2,3. 显然,“ 1110011000 ”不好。

Tokitsukaze 想使s改变一些位置的值. 具体来说,她可以执行任意次数的操作:改变 si 为“ 0 ”或“ 1 ”(1≤i≤n)。

你能告诉她最少的修改次数吗?

思路

因为字段长度都为偶数,因此我们可以每次判断2位,这2位必须为相同的数。

我们只要记录有几个不同的就是要修改的次数。

代码

#include <bits/stdc++.h>
using namespace std; void solve()
{
int n;
string s;
cin >> n >> s;
int cnt = 0;
for (int i = 0; i < n; i = i + 2)
{
if (s[i] != s[i + 1])
cnt++;
}
cout << cnt << endl;
} int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}

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

题意

这是问题的困难版本。两个版本之间的唯一区别是,较难的版本额外要求最小数量的子段。

Tokitsukaze 有一个二进制字符串s长度n,仅由0和1组成,n是偶数。

现在Tokitsukaze s成最小数量的连续子段,并且对于每个子段,每个子段中的所有数都是相同的。之后,s如果所有子段的长度都是偶数,则认为是好的。

例如,如果ss为“ 11001111 ”,将分为“ 11 ”、“ 00 ”和“ 1111 ”。它们的长度是2,2,4分别是偶数,所以“ 11001111 ”是好的。

另一个例子,如果s为“ 1110011000 ”,将分为“ 111 ”、“ 00 ”、“ 11 ”和“ 000 ”,它们的长度分别为3,2,2,3. 显然,“ 1110011000 ”不好。

Tokitsukaze 想使s改变一些位置的值. 具体来说,她可以执行任意次数的操作:改变 si 为“ 0 ”或“ 1 ”(1≤i≤n)。

你能告诉她最少的修改次数吗?同时,她还想知道最小的子段数s可以在所有操作数最少的解决方案中进行划分。

思路

计算次数的方法同上。

我们可以在每次判断2个数不同时对其进行修改,每次都修改成和左边相同。

然后在遍历求字段数。

需要注意的是当开头的两个数不同时我们可以把它们都赋值为1 或 0 ,分别求出子段数再输出最小值。

代码

#include <bits/stdc++.h>
using namespace std; void solve()
{
int n;
string s;
cin >> n >> s;
int cnt = 0;
string s1 = s, s2 = s;
if (s[0] != s[1])
{
cnt = 1;
s1[0] = '0';
s1[1] = '0';
s2[0] = '1';
s2[1] = '1';
for (int i = 2; i < n - 1; i = i + 2)
{
if (s[i] != s[i + 1])
{
cnt++;
if (s1[i - 1] == '1')
{
s1[i] = '1';
s1[i + 1] = '1';
}
else
{
s1[i] = '0';
s1[i + 1] = '0';
}
if (s2[i - 1] == '1')
{
s2[i] = '1';
s2[i + 1] = '1';
}
else
{
s2[i] = '0';
s2[i + 1] = '0';
}
}
}
int a = 0, b = 0;
for (int i = 1; i < n; i++)
{
if (s1[i] != s1[i - 1])
a++;
if (s2[i] != s2[i - 1])
b++;
}
cout << cnt << " " << min(a, b) + 1 << endl;
return;
}
for (int i = 2; i < n - 1; i = i + 2)
{
if (s[i] != s[i + 1])
{
cnt++;
if (s[i - 1] == '1')
{
s[i] = '1';
s[i + 1] = '1';
}
else
{
s[i] = '0';
s[i + 1] = '0';
}
}
}
int a = 0;
for (int i = 1; i < n; i++)
{
if (s[i] != s[i - 1])
a++;
}
cout << cnt << " " << a + 1 << endl;
} int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}

C. Tokitsukaze and Strange Inequality

题意

给定一个序列 s ,找出 [a,b,c,d](1<=a<b<c<d<=n),满足    的数量。

思路

固定 b 和 c。
每次只需找到 [1,b−1]中小于  的值的数量以及 [c+1,n] 中小于  的数量,相乘之后累加就是答案。
预处理一个前缀和数组 dp[i][j],表示前 i 个中小于等于 j 的数量有多少个。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5010;
int T, n, s[N], dp[N][N];
void solve()
{
int n;
cin >> n;
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++)
{
cin >> s[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
dp[i][j] += dp[i - 1][j];
}
for (int j = s[i]; j <= n; j++)
dp[i][j]++;
}
ll ans = 0;
for (int i = 2; i <= n - 2; i++)
{
for (int j = i + 1; j <= n - 1; j++)
{
ll a = dp[i - 1][s[j]];
ll b = dp[n][s[i]] - dp[j][s[i]];
ans += a * b;
}
}
cout << ans << endl;
;
}
int main()
{
ios::sync_with_stdio(0);
cin >> T;
while (T--)
{
solve();
}
return 0;
}

Codeforces Round #789 (Div. 2)的更多相关文章

  1. Codeforces Round #789 (Div. 2) A-C

    Codeforces Round #789 (Div. 2) A-C A 题目 https://codeforces.com/problemset/problem/1677/A 题解 思路 知识点:模 ...

  2. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  3. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  4. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  5. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  6. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  7. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  8. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  9. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

随机推荐

  1. 图解 Git 工作原理

    此页图解 git 中的最常用命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. git add fil ...

  2. Android添加背景图片和设置app图标

    Android添加背景图片和设置app图标 Android 添加背景图片 第一步:找到你要当做背景的图片,并下载下来 第二步:将图片复制到app->res->mipmap文件夹下 第三步: ...

  3. Python 散列表查询_进入<哈希函数>为结界的世界

    1. 前言 哈希表或称为散列表,是一种常见的.使用频率非常高的数据存储方案. 哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行 API 定制,对于大部分高级语言而言,都会提供已经实现好 ...

  4. 893. Groups of Special-Equivalent Strings - LeetCode

    Question 893. Groups of Special-Equivalent Strings Solution 题目大意: AB两个字符串相等的条件是:A中偶数位出现的字符与B中偶数位出现的字 ...

  5. 好客租房54-props深入(children属性)

    children属性 表示组件标签的子节点 当组件标签有子节点是 props就会有该属性 props中的组件可以是任意属性 都是可以渲染的 //导入react     import React fro ...

  6. WPF 分组

    分组和树形结构是不一样的. 树形结构是以递归形式存在.分组是以键值对存在的形式,类似于GroupBy这样的形式. 举个例子 ID NAME SEX Class 1 张三 男 1 2 李四 女 2 3 ...

  7. 如何在 pyqt 中自定义工具提示 ToolTip

    前言 Qt 自带的工具提示样式不太好看,就算加了样式表也时不时会失效,同时工具提示没有阴影,看起来就更难受了.所以本篇博客将会介绍自定义工具提示的方法,效果如下图所示: 实现过程 工具提示其实就是一个 ...

  8. springcloud 断路器

    https://www.jb51.net/article/138572.htm 参考资料: http://www.cnblogs.com/ulysses-you/p/7281662.html http ...

  9. linux运维基础2

    内容概要 虚拟机关键配置名词解释 远程链接工具 xshell基本使用 linux命令准则 系统运⾏命令 常用快捷方式 文件命令操作 文件编辑命令 内容详情 虚拟机关键配置名词解释 # 虚拟网络编辑器说 ...

  10. Amazon 消息订阅对接

    亚马逊的api 谁用谁知道...... 除了坑还是坑 头疼一周整出来,分享给铁汁们 amazon 的订阅思维,我只能说外国人脑回路有点长 下面就讲讲具体流程步骤: 第一步: 参照官方教程:设置通知(A ...