【POJ1068】Parencodings
本题知识点:模拟
这是一道恐怖的括号题。题意稍微理解以下还是可以的。
我们针对样例来理解一下 S、P、W 到底是什么意思:
S:( ( ( ( ) ( ) ( ) ) ) )
P:
\(P_1\) 为 4 :是因为在第一个 ) (数组第4位)前面有4个 (
\(P_2\) 为 5 :是因为在第二个 ) (数组第6位)前面有5个 (
\(P_3\) 为 6 :是因为在第三个 ) (数组第8位)前面有6个 (
(后面 \(P_4\) \(P_5\) \(P_6\) 情况跟 \(P_3\) 是一样的,所以不重复啰嗦了)
W:
\(W_i\) 表示的是括号数,为了表示清楚一点下面用粗体标清楚
\(W_1\) 为 1:是因为 ( ( ( ( ) ( ) ( ) ) ) ) 在与第一个 ) 前面的 ( 只形成了 1 个 ( )
(\(W_2\) \(W_3\) 情况跟 \(W_1\) 一样)
\(W_4\) 为 4:是因为 ( ( ( ( ) ( ) ( ) ) ) ) 第 4 个 ) 与数组第 2 位的 ( 配对了,除了它们俩一对外,它们还包含了里面 3 对,所以是 4 对
为什么第 4 个不能与数组第 7 位的 ( 配对?因为第 7 位的已经跟前面的 ) 配对了。
相信看到这里就算没读懂题意的你也有一点开窍了。从第一个 ) 开始,与它最相近的 ( 进行配对,配对之后就不能让后者配对了。所以我们这里可以弄一个bool数组来记录 ( 是否已经配对。
在此之前,我们还要先构造出 S 的字符串,这个构造比较简单,请结合代码思考一下。
随后就遍历一下 S 字符串,再记录一下每个 ) 所对应的答案即可。
数据很小,这种暴力解题没有问题!
// POJ 1068
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T, n;
int P[25], W[25], pla[25];
char pra[50];
bool take[50];
int main()
{
scanf("%d", &T);
while(T--){
memset(take, false, sizeof(take));
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &P[i]);
// 构造 S 字符串
int left = 0, i = 0, k = 0;
while(i < n){
if(left == P[i]){
pra[k++] = ')';
i++;
}
else {
pra[k++] = '(';
left++;
}
}
// 记录每个 ) 的位置
int cnt = 0, c = 0;
for(int i = 0; i < n * 2; i++){
if(pra[i] == ')') {
pla[cnt++] = i;
}
}
// 最终遍历找答案
for(int i = 0; i < cnt; i++){
int j = pla[i], ans = 0;
while(j >= 0){
if(pra[j] == '('){
ans++;
if(!take[j]){
W[c++] = ans;
take[j] = true;
break;
}
}
j--;
}
}
for(int i = 0; i < c; i++){
printf("%d%c", W[i], i != c - 1 ? ' ' : '\n');
}
}
return 0;
}
【POJ1068】Parencodings的更多相关文章
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- Windows 7 下安装 docker
Windows 7 下需要安装docker toolbox即可(里面打包了docker.oracle virtualbox.Git) 1. 下载 1. 下载路径https://github.com/d ...
- 常见的python练习题
1.冒泡排序 def bubble_sort(lists): len_list=len(lists) for i in range(len_list): for j in range(len_list ...
- win10设置锁屏密码
1.点击右下角窗口键 2.选择点击设置 3.点击账户 4.点击登录选项 5.点击密码,添加密码 6.设置密码 7.使用快捷键“窗口键+l”锁屏,就会提示你输入密码
- js数据类型及变量知识(一)
1.js中基本数据类型有哪些? 基本数据类型: undefined.number.string.boolean.null.[object] object[引用数据类型] ...
- Linux基础-7.Linux网络基础设置
装好Linux,Linux一般会默认使用NetworkManager来辅助管理网络配置.对于配置Linux服务器来说,我们不需要NetworkManager来配置网络,所以要关闭它,不然它会影响手动配 ...
- 高阶函数概念以及map/filter/reduce
什么样的函数叫高阶函数:map(func, *iterables) --> map object 条件:1.函数接受函数作为参数 2.函数的返回值中包含函数 num_l = [1,2,3,4,5 ...
- 在Ubuntu系统下连接远程服务器并传输文件
原文链接:https://blog.csdn.net/u013250416/article/details/78075590 一. 连接远程Ubuntu服务器. 1. 打开命令行,输入 : sud ...
- vsftp网络服务
1. vsftp概述 FTP是File Transfer Protocol(文本传输协议)的简称,用于Internet上的文件的双向传输.使用FTP传输时,具有一定程度的危险性,因为数据在因特网上面是 ...
- php的冒泡排序
有其它语言基础, 这些套路弄起来就是快! 都在注释里~ <?php /** * 冒泡排序 PHP实现 * 原理:两两相邻比较,如果反序就交换,否则不交换 * 时间复杂度:最好 O(n) 最坏 O ...
- Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'qingmu' for key 'PRIMARY'
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolatio ...