[CodeForces950C]Zebras
Description
题目地址: Codeforces
题意:给你一串只含01的字符串,判断能否将字符串分为k个子序列,使得子序列满足以下条件:
- 开头和结尾都是0
- 相邻的2个数是01或者10
如0, 010, 01010 是合法的,1, 0110, 0101不合法
要求输出方案
(k可以为任意正整数,评测用SPJ)
Solution
我们发现,0可以单独为一组,那么只要匹配完所有的1剩下的0全单独算就行了
对于方案可以用vector储存,关键在于如何划分子序列
开一个指针变量p和一个方案数cnt,p指向一个序列,且保证当前p序列的最后面是0
现在依次考虑每个数字
如果当前数字是0并且p==cnt那么直接新开一个序列,否则把这个0放到p+1的序列中,且++p,这里因为p<cnt所以p+1的序列中必定结尾为1
如果数字是1就把这个1直接放在当前p的序列中,然后p--,这里保证当前序列结尾是0,且p-1的序列结尾是0
简单来说,保证结尾为1的序列全在p的后面,前面(包括p)的序列结尾都是0
方法挺巧妙的,时间复杂度为O(n)
Code
#include <cstdio>
#include <vector>
#include <ctype.h>
using namespace std;
vector<int> Ans[200010];
int p,cnt,n=1;
int main(){
for(char ch=getchar();isdigit(ch);ch=getchar(),n++)
if(ch=='1'){
if(!p){printf("-1\n");return 0;}//1过多的情况
Ans[p--].push_back(n);
}else if(p==cnt) Ans[p=++cnt].push_back(n);
else Ans[++p].push_back(n);
if(p<cnt){printf("-1\n");return 0;}//0过多的情况
printf("%d\n",cnt);
for(int i=1;i<=cnt;++i){
printf("%d ",Ans[i].size());
for(int j=0;j<Ans[i].size();++j)
printf("%d ",Ans[i][j]);
printf("\n");
}
return 0;
}
[CodeForces950C]Zebras的更多相关文章
- Codeforces Round #469 (Div. 2)C. Zebras(思维+模拟)
C. Zebras time limit per test memory limit per test 512 megabytes input standard input output standa ...
- A - Zebras
Oleg writes down the history of the days he lived. For each day he decides if it was good or bad. Ol ...
- Codeforces 950 C. Zebras
http://codeforces.com/contest/950/problem/C 题意: 给出一个01序列,问能否将这个序列分为若干个0开头0结尾的序列 输出方案 如果有解,几个1能在一个序列就 ...
- CodeForces - 950C Zebras 模拟变脑洞的天秀代码
题意:给你一个01串,问其是否能拆成若干形如0101010的子串,若能,输出所有子串的0,1 的位置. 题解:一开是暴力,然后瞎找规律, 最后找到一种神奇的线性构造法:扫一遍字符串,若为0就一直竖着往 ...
- Zebras CodeForces - 950C(思维)
借鉴自: https://www.cnblogs.com/SuuT/p/8619227.html https://blog.csdn.net/my_sunshine26/article/details ...
- codeforce469DIV2——C. Zebras
题意 0, 010, 01010 这一类的01交替且开头和结尾都为0的序列被称为zebra序列.给出一段01序列,尝试能否把他分为k个子序列使得每个子序列都是zebra序列. 分析 这个题应该算是水题 ...
- CF949A/950C Zebras
思路: 贪心乱搞. 实现: #include <bits/stdc++.h> using namespace std; vector<vector<int>> v; ...
- CF949A Zebras 构造
是一道不错的构造题. 我们观察,一个 111 的前后必须都有 000. 那么,我们开一个二维数组 (vector)(vector)(vector),这样每遇到一个 000 就将 000 加入到当前的 ...
- Codeforces 950C Zebras ( 贪心 && 模拟 )
题意 : 给出一个 01 串,要求你将其分隔出若干个子序列 ( 每个数字只能属于某一个子序列 ) ,子序列必须满足由 0 开头和结尾,且中间需 01 交替构成.若无法做到,则输出 -1. 分析 : ...
随机推荐
- flexpager权限控制文件crossdomain.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cross-domain-policy SY ...
- 在CentOS上配置redis服务
#!/bin/sh # # redis Startup script for Redis Server # # chkconfig: - 80 12 # description: Redis is a ...
- laravel下的ORM数据映射之自由畅想
此处以Model::get()方法和Model::first()方法为例 public static function get($data=[]){//默认是空数组 if(count($data)== ...
- 秒懂JSON.parse()与JSON.stringify()的区别
在网站开发中,Json是最为常见的一种数据交互手段.在使用过程中,常会遇到Json字段串和对象之间进行转换.很多朋友对于JSON.parse() 和JSON.stringify() 的区别,下面为大家 ...
- javaWeb上移下移(SpringMVC+Mabits+MySql)
文章已移至:https://blog.csdn.net/baidu_35468322/article/details/79643356 移动之前: 移动之后: 1.控制层 /** * 修改排序 * * ...
- vs下如何调试Dll
1.首先需要一个exe加载你的dll 2.dll项目的属性设置 3.将dll设为启动项 4.在dll中设置断点 F5就可以调试了
- Docker和宿主机操作系统文件目录互相隔离的实现原理
我们知道在Docker容器里是无法访问到宿主操作系统的文件目录的,但这种隔离是怎么实现的呢? 其实一点也不神奇--利用了Linux系统的内部命令chroot. chroot能将进程的根目录设置成任意指 ...
- python 字符串部分总结
字符串 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符 >>> ord('A') 65 >>> ord ...
- bpclntcmd一条神奇的命令,解决新安装nbu客户端无法连接的问题 (屡试不爽神命令)
1. bpclntcmd案例 bpclntcmd -clear_host_cache bpclntcmd – 测试 NetBackup 系统的功能,并在 NetBackup 客户端上启用光纤传输服务 ...
- Oracle数据库几种启动方式及查询当前状态
Oracle数据库几种启动方式 1.startup nomount: 非安装启动,这种方式下启动可执行:重建控制文件.重建数据库,读取init.ora文件,启动instance,即启动SGA和后台进程 ...