[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. 分析 : ...
随机推荐
- html中的兼容 & 如何对网站的文件和资源进行优化
一.1.双边距 BUG float引起的 使用display 2.超链接hover 点击后失效 使用正确的书写顺序 link visited hover active (可简单看成由 爱生恨 lo ...
- JQ单双引号转义
var temp = "${row.address_province}"; alert(temp);——————即变量temp alert("\'"+temp+ ...
- 转:Windows任务计划实现自动执行ArcGIS相关功能
今天一不小心点开了Windows任务计划,以前咩有怎么用过,发现还挺好用,于是想到了以前用户的一些问题 1:用户环境使用ArcSDE服务连接,每次运行到一定的负载量(可能是几天),就会很慢,用户就喜欢 ...
- Oracle:Start with connect by prior 递归
SELECT * from CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR列名2} [START WITH]; Oracle的递归查询: START WITH :描述开始 ...
- ActionMethod_DMI_动态方法调用
Action执行的时候并不一定要执行execute方法可以在配置文件中配置Action的时候用method=来指定执行那个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐) 动态方法调用 ...
- 显示C++ vector中的数据
C++ 中的vector是一个容器数据类型,不能使用cout直接显示容器中的值. 以下程序中,myvector 是一个vector数据类型.将myvector替换为需要输出的vector. for(i ...
- 金庸的武侠世界和SAP的江湖
2018年10月30日晚,成都地铁一号线,Jerry手机app上突然弹出来一条金庸去世的新闻. Jerry识字很早,小学一年级就开始蹭我父亲的<射雕英雄传>看了.小时候,我爸工作的车间里有 ...
- SAP Fiori里的List是如何做到懒加载Lazy load的
今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示. 以Product Master这个应用为例,我点击搜索之后 ...
- 请教Nutzwk项目,在beetl页面怎么用shiro标签呢?
请教Nutzwk项目,在beetl页面怎么用shiro标签呢? 发布于 381天前 作者 WenTao-Love 195 次浏览 复制 上一个帖子 下一个帖子 标签: nutzwk 如题 ...
- cutil.h问题
CUDA5.0没有cutil.h头文件,貌似用helper_cuda.h文件代替,暂时没出问题.