0x11 栈

【例题】Push,Pop,GetMin

手写一个栈

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 using namespace std;
 8 const int maxn=1000000;
 9 int stack[maxn], m[maxn], top=0, m_top=0;
10 int n;
11 
12 void push(int x) {
13     stack[++top]=x;
14     int tmp=m[m_top];
15     m[++m_top]=min(x, tmp);
16 }
17 
18 void pop() {
19     stack[top]=m[m_top]=0;
20     --top, --m_top;
21 }
22 
23 int main() {
24     int x;
25     char ops[3];
26     m[0]=0x3f3f3f3f;
27     scanf("%d", &n);
28     for (int i=1; i<=n; ++i) {
29         scanf("%s %d", ops, &x);
30         if (ops[0]=='p') push(x);
31         else if(ops[0]=='q') pop();
32         printf("The current minimum number: %d\n", m[m_top]);
33     }
34     return 0;
35 }
View Code

【例题】HDOJ4699 Editor

考虑维护一个对顶栈,一开始用STL里的栈过不了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 const int maxn=1000000+10;
10 const int INF=0x3f3f3f3f;
11 int f[maxn], sum[maxn];
12 //stack<int> A, B;
13 int A[maxn], B[maxn], tpA, tpB;
14 
15 int main() {
16     //freopen("a.txt", "r", stdin);
17     int n;
18     while (~scanf("%d", &n)) {
19     char ops[3]; int t;
20     sum[0]=0, f[0]=-INF, tpA=0, tpB=0;
21     while (n--) {
22         scanf("%s", ops);
23         if (ops[0]=='I') {
24             scanf("%d", &t);
25             /*A.push(t);
26             int p=A.size();
27             sum[p]=sum[p-1]+t;
28             f[p]=max(f[p-1], sum[p]);*/
29             A[++tpA]=t;
30             sum[tpA]=sum[tpA-1]+t;
31             f[tpA]=max(f[tpA-1], sum[tpA]);
32         }
33         if (ops[0]=='D') {
34             //A.pop();
35             --tpA;
36         }
37         if (ops[0]=='L') {
38             /*if (!A.empty()) {
39                 int tmp=A.top();
40                 A.pop();
41                 B.push(tmp);
42             }*/
43             if (tpA) {
44                 int x=A[tpA];
45                 --tpA;
46                 B[++tpB]=x;
47             }
48         }
49         if (ops[0]=='R') {
50             /*if (!B.empty()) {
51                 int tmp=B.top();
52                 B.pop();
53                 A.push(tmp);
54                 int p=A.size();
55                 sum[p]=sum[p-1]+tmp;
56                 f[p]=max(f[p-1], sum[p]);
57             }*/
58             if (tpB) {
59                 int x=B[tpB];
60                 --tpB;
61                 A[++tpA]=x;
62                 sum[tpA]=sum[tpA-1]+x;
63                 f[tpA]=max(f[tpA-1], sum[tpA]);
64             }
65         }
66         if (ops[0]=='Q') {
67             scanf("%d", &t);
68             printf("%d\n", f[t]);
69         }
70     }
71     }
72     return 0;
73 } 

【例题】CH1101/CH1102 进出栈序列问题

方法一:搜索

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 const int maxn=30;
10 int n, cnt=0, kase=0, ans[maxn]; 
11 int s[maxn], top=0;
12 
13 void dfs(int x) {
14     if (kase>20) return;
15     if (x==n+1) {
16         if (++kase>20) return;
17         for (int i=1; i<=cnt; ++i)
18             printf("%d", ans[i]);
19         for (int i=top; i>0; --i)
20             printf("%d", s[i]);
21         printf("\n");
22         return;
23     }
24     if (top) {
25         ans[++cnt]=s[top--];    //出栈 
26         dfs(x);
27         s[++top]=ans[cnt--];
28     }
29     s[++top]=x;
30     dfs(x+1);
31     --top;
32 }
33 
34 int main() {
35     cin>>n;
36     dfs(1);
37     return 0;
38 } 
View Code

方法二:递推

因为不计算具体的序列,只计算方案数

8分代码,需要高精度,我不会。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 const int maxn=60000+10;
10 int n;
11 long long s[maxn];
12 
13 
14 int main() {
15     scanf("%d", &n);
16     s[0]=1, s[1]=1, s[2]=2;
17     for (int i=3; i<=n; ++i) {
18         //考虑1这个数排在最终出栈序列的位置
19         for (int j=1; j<=i; ++j)
20             s[i]+=s[j-1]*s[i-j]; 
21     }
22     printf("%lld\n", s[n]);
23     return 0;
24 } 
View Code

方法三:dp

放弃。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 const int maxn=60000+10;
10 int n;
11 long long f[maxn][maxn];
12 
13 
14 int main() {
15     scanf("%d", &n);
16     f[0][0]=1;
17     for (int i=1; i<=n; ++i) {
18         for (int j=1; j<=n; ++j) {
19             f[i][j]=f[i-1][j]+f[i][j-1];
20         }
21     }
22     printf("%lld\n", f[n][0]);
23     return 0;
24 } 
View Code

 方法四:数学

Catalan数

单调栈

及时排除不可能的选项,保持策略集合的高度有效性和秩序性

【例题】POJ2559 Largest Rectangle in a Histogram

考虑维护一个单调栈,在出栈过程中不断更新答案,可以在an右边添加一个高度为0的矩形,避免栈内有剩余矩形。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int maxn=100000+10;
const int INF=0x3f3f3f3f;
int n, a[maxn], w[maxn];
int s[maxn], p=0;int main() {while (scanf("%d", &n)&&n) {long long ans=0;for (int i=1; i<=n; ++i)scanf("%d", &a[i]);a[n+1]=p=0;for (int i=1; i<=n+1; ++i) {if (a[i]>s[p]) {s[++p]=a[i], w[p]=1;}else {int width=0;while (s[p]>a[i]) {width+=w[p];ans=max(ans, (long long)width*s[p]);--p;} s[++p]=a[i], w[p]=width+1;}}printf("%lld\n", ans);}return 0;
} 

 

转载于:https://www.cnblogs.com/kkkstra/p/11104795.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 同类型转换失败,你们见过java类型转换,自己转自己失败的情况吗?很神奇的操作...

问题就是上面这个问题。List slaughterProducts slaughterForm.getSlaughterProductModelForm();for (SlaughterProductModelForm e : slaughterProducts) {....}居然运行到for的时候出现上面这个错误。很神奇吧&#xff0c;工作这么多年了第一次发现 JAVA自己转自己转不成功。…

用户管理与文件权限

一&#xff1a;用户管理 现代操作系统一般属于多用户的操作系统&#xff0c;也就是说&#xff0c;同一台机器可以为多个用户建立账户&#xff0c;一般这些用户都是为普通用户&#xff0c;这些普通用户能同时登录这台计算机&#xff0c;计算机对这些用户分配一定的资源。 普通用…

php中划线,html中下划线、删除线、上划线的样式与用法实例

这篇文章主要介绍了下划线、删除线、上划线等常用的实例&#xff0c;划线是非常常见的一种样式&#xff0c;为了网页中的视觉效果以及对文字的说明&#xff0c;我们经常对文体进行一些划线操作。下面文章就是对各种划线的详细介绍。一. 下划线的详细介绍在我们日常的Web的开发中…

php获取页面中的指定内容,php 获取页面中指定内容的实现类

[email protected]image&#xff1a;Grep.class.php/** grep class* Date: 2013-06-15* Author: fdipzone* Ver: 1.0** Func:** set: 设置内容* get: 返回指定的内容* replace: 返回替换后的内容* get_pattern 根据type返回pattern*/class Grep{ // class startprivate $_patte…

数据增量更新定义_TiDB 在 OPPO 准实时数据仓库中的实践

作者介绍OPPO 数据分析与解决方案团队主要负责 OPPO 全集团的大数据分析和解决方案提供&#xff0c;团队成员多来自一线互联网公司及著名高校&#xff0c;在 OPPO 众多场景的大数据应用方面有很深经验&#xff0c;极大的支撑了业务迅速发展。文章具体作者&#xff1a;羊欢&…

selenium--单选下拉列表

下拉选择 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("https://www.xxxxx.com/") sleep(2) driver.find_elements_by_tag_name(option)[2].click() # 通过标签名定位到 option 标签&#xff0c;选择第三个&#x…

matlab实现字符识别,字符识别 - MATLAB Simulink Example - MathWorks 中国

定义问题脚本 prprob 定义了一个包含 26 列的矩阵 X&#xff0c;每列对应一个字母。每列有 35 个值&#xff0c;值可能是 1&#xff0c;也可能是 0。每列(包含 35 个值)定义一个字母的 57 位图。矩阵 T 是一个 2626 的单位矩阵&#xff0c;它将 26 个输入向量映射到 26 个类。[…

批处理结束某个进程_进程调度

当计算机系统是多道程序设计系统时&#xff0c;常常会出现多个进程或线程竞争CPU的情况。如果有大于处理器数的进程(线程)处于就绪态时&#xff0c;就必须要选择下一个要执行的进程(线程)。在操作系统&#xff0c;用于选择接下来要执行的进程的程序称之为调度程序(Scheduler)&a…

动态游标for循环_数据结构系列循环链表

前面留的一个问题,后文更跟新回答单链表可以表示任意的线性关系&#xff0c;有些线性关系是循环的&#xff0c;既没有队尾元素。将单链表中的终端结点指针端由空指针改为指向头结点&#xff0c;这时的单链表形成国恒一个环&#xff0c;改为循环链表。插入与删除与单链表的原理甚…

sas sql 读取最后一行数据_SAS基础编程和数据处理

前几天讲了数据分析中SQL的基本使用方法以及具体案例分析思路&#xff0c;接下来会继续讲统计基础以及在SAS软件内的应用&#xff0c;在这之前&#xff0c;本文先进行SAS基础使用编程的基础介绍&#xff0c;后续会主要阐述SAS软件内的统计数学的应用&#xff0c;如分析或初步建…

代码合并工具_分享几款比较常用的代码比较工具

俗话说&#xff1a;三句不离本行&#xff0c;对于程序员这个可爱的群体来说也是一样&#xff0c;即使面对无休无止的编程工作&#xff0c;程序员们依旧任劳任怨的埋头苦干&#xff0c;梦想着用自己码下的代码改变世界。工欲善其事,必先利其器&#xff0c;每一位程序员都有自己私…

循环控制

循环控制 定义 Python 循环语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 并在符合条件的情况下跳出该段循环。 类似于控制语句。 如下图所示。 WHILE 循环 while 判断条件&#xff1a; 语句 求1~100的和 n 0 sum 0 while…

rest风格的get加密字符串怎么接收_RESTful Api的设计与风格,你该学一下咯

REST的重要概念REST全称是Representational State Transfer&#xff0c;中文意思是表征性状态转移。RESTful是指具有REST表征的web架构风格&#xff0c;并非必须遵守的规则。REST分离了API的结构和逻辑&#xff0c;主要应用于客户端和服务器交互类的软件。基于这种风格设计的软…

接口批量同步数据_千手接口平台+电商ERP,助德嵘大药房征战拼多多

拼多多对C端经营者来说&#xff0c;是一个处于红利期的第三方C端电商平台&#xff0c;进驻费比天猫低很多&#xff0c;而且流量成本也低&#xff0c;很多商家都跃跃欲试。但对于没有C端平台运营经验的商家&#xff0c;进驻后会发现几个"坑"&#xff1a;客单价低、退货…

php 接口有几种,【后端开辟】php接口有哪些范例?

接口是什么&#xff1f;运用接口(interface)&#xff0c;能够指定某个类必需完成哪些要领&#xff0c;但不须要定义这些要领的具体内容。接口是经由过程 interface 关键字来定义的&#xff0c;就像定义一个规范的类一样&#xff0c;但个中定义一切的要领都是空的。接口中定义的…

java是编译型语言还是解释型语言?

首先拿python和C说明&#xff0c;python运行速度慢&#xff0c;和C程序相比非常慢&#xff0c;因为Python是解释型语言&#xff0c;你的代码在执行时会一行一行地被python解释器翻译成CPU能理解的机器码&#xff0c;这个翻译过程非常耗时&#xff0c;所以很慢。而C/C程序是编译…

typedef函数指针_C语言函数指针之回调函数

1 什么是回调函数&#xff1f;首先什么是“回调”呢&#xff1f;我的理解是&#xff1a;把一段可执行的代码像参数传递那样传给其他代码&#xff0c;而这段代码会在某个时刻被调用执行&#xff0c;这就叫做回调。如果代码立即被执行就称为同步回调&#xff0c;如果过后再执行&a…

fedora 安装oracle 12c,Fedora 12下安装Oracle 11客户端

目标&#xff1a;将oracle-client(v11)安装到rdquo;/opt/oracle/rdquo;下准备好如下三个安装包&#xff0c;放在某个目录下&#xff0c;如&#xff1a;/root/software/ora目标&#xff1a;将Oracle-client(v11)安装到”/opt/oracle/”下准备好如下三个安装包&#xff0c;放在某…

轨迹跟踪主要方法_DELMIA教程:基于指令形式的机器人TCP轨迹局部跟踪方法

上一期为大家介绍了基于工具条中的“TCP Trace”命令按钮的全局TCP轨迹跟踪&#xff0c;之所以称之为全局轨迹跟踪&#xff0c;是因为只要命令被打开&#xff0c;机器人运行的全部轨迹都将实现跟踪。既然有全局TCP轨迹跟踪&#xff0c;那么就一定有局部TCP轨迹跟踪&#xff0c;…

[转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.htmlliamjeal电梯直达1# 发表于 2012-9-10 13:41:43 | 只看该作者 |只看大图 因CooCox用户数及影响力越来越大&#xff0c;CooCox团队也逐渐提高了对软件及代码协议的重…