B. Reverse Sort
第一次打codeforces,就做了一道签到题,这道题在看的时候以为挺简单的,看到好多人都出来了,自己想了好久也没做出来,还是看了大佬的解法才有的思路,我还是太菜了。
题目: 大概意思就是给一个01字符串,每次操作可以从中选一个子串做一个翻转然后放回原来的位置,问最小经过几次操作可以让字符串变为非递减的字符串(0都在1的前面)
总可以通过一次操作解决 (太妙了,当时没想到,我是废物) 我们可以对字符串的0,1进行一个统计,总可以找到一个位置,使得这个位置之前的1的数目等于这个位置之后的0的数目。 例如:101丨00,我们可以从竖线处分开,竖线前的1等于竖线后的0,我们只需要把前面的1和后面的0翻转位置,即可得到非递减的字符串。 为什么我们一定能找到这样一个位置呢? 我们假设一个位置,在此位置前面的1的数目大于后面的0的数目,那么我们只要把当前位置往前移,如果前面一个是1,那么前面1的数目会减少,后面0的数目不变,如果前面一个是0,那么后面0的数目会增加,前面1的数目不变,由此每向前移动一步,两者之间的差距会减一,当差距减到0的时候,即为要求的位置。
代码先上我自己写的超复杂版 用两个vector分别记录 1.从前往后在当前点之前1的数目 2.从后往前在当前点之后0的数目 然后用flag标记有没有找到上述的位置 如果没有则已经有序,直接输出0即可
#include
#include
#include
#include
using namespace std;
int main()
{
string s;
int n;
int T;
cin >> T;
while (T--)
{
cin >> n;
cin >> s;
vector cnt1(n, 0);
vector cnt0(n, 0);
int len = n;
int i;
bool flag = false;
for (i = 0; i = 0; i--)
{
if (s[i] == '0')
{
if (i == len - 1)
cnt0[i] = 1;
else
cnt0[i] = cnt0[i + 1] + 1;
}
else if (i != len - 1)
cnt0[i] = cnt0[i + 1];
}
for (i = 1; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?