ACM竞赛学习整理--模拟算法举例POJ1068
什么是模拟
仅仅使用较简单的算法和数据结构的题目。
模拟顾名思义,就是按照题目的要求,一步步写出代码。
常见的模拟方法
a.用数学量和图形描述问题
计算机处理的是数学量。若要用计算机解决实际问题,需要把实际问题抽象为数学量,或者数字。比如,记事本把文字按 ASCII 码表转换为数字储存起 来,极品飞车把赛车的性能表示为数字,来权衡赛车的好坏。
一个漂亮的算法,需要用数学量表示出来。
有时,我们需要用更直观的图形来描述实际问题。
图论就是一个绝佳的方法。图是一种表示离散量间关系的形式,它也是一种思想,常被用于建模。同时,前人也为我们提供了很多现成的图论算法,能够解决很多常 见问题,这些将在之后被提到。
矩阵也是一种常见的方法。有时矩阵被表示成三角形的形式,比如“杨辉三角”。矩阵常常和数学有关,
在计算机计算时常常利用矩阵的递推式。这也将在后面被提 到。
b.模拟计算过程
模拟方法是最常见、最直接的算法构建方法。
有些模拟算法还涉及到图形和其他复杂的数据结构,这需要我们熟练地运用语言,巧妙地把其他关系转化为数学量间关系。
举例:
POJ1068
Description
Let S = s1 s2…s2n be a well-formed string of parentheses. S can be encoded in two different ways:
q By an integer sequence P = p1 p2…pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence).
q By an integer sequence W = w1 w2…wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence).
Following is an example of the above encodings:
S (((()()())))
P-sequence 4 5 6666W-sequence 1 1 1456
Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 <= n <= 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.
Output
The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.
Sample Input
2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6
1 1 2 4 5 1 1 3 9
问题描述:
一组括号 (((( ) ( ) ( ) ) ) )
有两种描述方法:
P方法:4 5 6 6 6 6 - 每一个)前,有几个(
W方法:1 1 1 4 5 6 - 每一个),向前数几个是跟它匹配的(
要求是根据P求W
解题思路:
1. 虽然没说,但是可以推测出,括号的个数是偶数;第一个一定是(,最后一个一定是)
2. P方法和W方法之间可能存在公式类的规律,但是要寻找不是特别简单
3. 手动分析过程中,我们知道,可以模拟出推到W的过程-模拟法
4. 括号匹配,一定是stack结构
5. 思路就是:根据P还原括号数组,利用stack,推到出W
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{int n;cin >> n;for (int i=0; i<n; i++){int m;cin >> m;string str;int leftpa = 0;for (int j=0; j<m; j++) //使用stack,将p序列还原成括号序列{int p;cin >> p;for (int k=0; k<p-leftpa; k++) str += '(';str += ')';leftpa = p;}stack<int> s;for (string::iterator it=str.begin(); it!=str.end(); it++){//将左括号记为1,压入栈,扫到右括号,弹出栈顶元素,将新的栈顶元素加上已扫到的右括号的数目,if (*it=='(')s.push(1);else{int p = s.top(); s.pop();cout << p << " ";if (!s.empty()) s.top() += p;}}cout << endl;}return 0;
}
PS:
该程序设计当中用到了C++ STL中的stack
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。
c++ stl栈stack的成员函数介绍:
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
想必搞懂了堆栈的内容,这样类似的题应该不算难解。
ACM竞赛学习整理--模拟算法举例POJ1068相关推荐
- NOIP竞赛学习整理--动态规划算法举例P1264
动态规划 什么是动态规划? 动态规划是解决多阶段决策最优化问题的一种思想方法.所谓"动态",指的是在问题的多阶段决策中,按某一顺序,根据每一步所选决策的不同,将随即引起状态的转移, ...
- ACM竞赛学习整理--矩阵运算
ACM竞赛学习整理–矩阵运算 了解矩阵类 [任务] 实现矩阵的基本变换 [接口] 结构体:Matrix 成员变量: int n,m 矩阵大小 int a[][] 矩阵内容 重载运算符: +.-.x 成 ...
- ACM竞赛学习整理开篇之01背包问题
ACM竞赛学习整理开篇之01背包问题. 最近,偶然的一次机会让我关注信息奥赛的一些内容.发现其中的内容很有趣,是学习编程的一条很好的路径,又能很好地将数学和编程联系到一起.在csdn里看到了不少同好也 ...
- ACM竞赛学习指南(算法工程师成长计划)
算法工程师成长计划 近年来,算法行业异常火爆,算法工程师年薪一般20万-100 万.越来越多的人学习算法,甚至很多非专业的人也参加培训或者自学,想转到算法行业.尽管如此,算法工程师仍然面临100万的人 ...
- ACM竞赛学习整理--Gauss求解POJ1166
这道题目和1830比较类似,1830是求解的个数,这道题目相当于求线性方程组的整数解. 题目主要内容:有9个钟,其中9个操作方法来扳动上面的指针,每个操作每次只能把指针移动90度,且每个操作是对一组钟 ...
- ACM竞赛学习记录------迷宫寻宝(BFS广度优先搜索)
题目 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口.一些墙壁以及一个宝藏.由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上.下.左.右) ...
- ACM如何入门,ACM竞赛需要学习哪些算法?
#################成绩################## 大一:2017年4月份"玲珑杯"河南工业大学2017年ACM程序设计大赛暨河南高校邀请赛,获得银奖 20 ...
- 对于ACM竞赛算法分类的整理
用一个思维导图整理了竞赛涉及到的算法分类. 有机会可以和同学们讨论一下.
- 信息学竞赛学习资料整理
信息学竞赛学习资料整理 一.总结 一句话总结:可以在网上获取各种免费视频资源,网上超多,也可以买书,也可以去刷题网站多做题 1.信息学竞赛书籍推荐? 信息学竞赛一本通 算法导论 组合数学 <CC ...
最新文章
- 实战SSM_O2O商铺_23【商铺列表】Controller层开发
- 安装visual studio 2013--【转】
- 10行Python代码自动清理电脑内重复文件
- C#中对文件进行选择对话框打开和保存对话框进行复制
- 15个JavaScript 编码小技巧
- SQL优化的若干原则
- 运算符之:5、位运算符(7个)
- 【转】RabbitMQ六种队列模式-1.简单队列模式
- python分类下取得所有子类_如何找到给定名称的类的所有子类?
- 使用 Nginx+SpringBoot+Redis 实现负载均衡以及session共享
- PHPExcel如何把该列的值设置为文本无科学计数?
- Android配置使用SQLite3
- matlab密钥生成,使用文件安装密钥安装产品
- 华为网络技术大赛笔记——服务器概述
- 蓝桥杯近三年初赛题之一(15年b组)
- OSError: [Errno 1] Operation not permitted: '/tmp/pip-g3bg0s-uninstall/System/Library/Frameworks/Pyt
- 小程序_图片剪切功能(支持多图片上传)
- 微信小程序识别字符串中的手机号,手机号高亮显示,并且可以点击这个手机号,拨打电话?
- OSChina 周四乱弹 ——今天家里只有我和女室友,我想……
- 关于SVN提交不成功问题