[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. 分析 : ...
随机推荐
- 3.HTML DOM
介绍 DOM(Document Object Model)文档对象模型,定义了访问 HTML 和 XML 文档的标准,它允许程序和脚本动态地访问和更新文档的内容.结构和样式. 那显然,HTML DOM ...
- spring笔记2-注解
一.属性与成员变量的区别: 属性:对外暴露的,getxxx/setxxx称为属性; 成员变量:private String name称为成员变量或字段 二.applicationContext.xml ...
- [javascript]什么是闭包?
http://www.zcfy.cc/article/master-the-javascript-interview-what-is-a-closure-2127.html
- ssh-agent && ssh-agent forward && SSH ProxyCommand
http://blog.csdn.net/sdcxyz/article/details/41487897 https://developer.github.com/guides/using-ssh-a ...
- SQL varchar转float实现数字比较
select * from table where cast('经纬度' as float ) < 90
- java——二叉树面试题
import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...
- log4net 简单配置
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigu ...
- TypeScript学习-TypeScript环境配置
http://blog.csdn.net/shi_weihappy/article/details/49332091
- kubernetes-控制器statefulset和Job(十三)
从前面的学习我们知道使用Deployment创建的pod是无状态的,当挂载了Volume之后,如果该pod挂了,Replication Controller会再启动一个pod来保证可用性,但是由 ...
- C# while语句
一.C# while语句 while语句是用于重复执行程序代码的语句. 语法格式如下: while(boolean-expression){ embedded-statement} 当boole ...