单调队列练习题(oj p1157 p1158 p1159)
p1157是很气人的...自从评测机挂了后,速度就特别慢,cin已经过不了了,然而我不知道,就各种**的提交
惨兮兮惨兮兮,这还是开了小号(通过率堪忧.jpg...)...
思路就是单调队列维护,用队列存储k个数中最小数下标......还是代码加注释好懂
#include <bits/stdc++.h>
using namespace std;
int n,k;
int qm[1000006],tail=1,head=1;
int a[1000006];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
qm[head]=1;
for(int i=2;i<=k;i++)
{
while(a[i]<a[qm[tail]]&&tail>=head)//维护单调递减,在k个数内,如果当前元素有小于队尾元素(队列中下标对应原数组中的数)
tail--;//出队
qm[++tail]=i;//入队
}
for(int i=k;i<=n;i++)
{
if(i-qm[head]==k)//如果i-队头元素下标==k,证明该换最小值了,就head++;
head++;
while(a[i]<a[qm[tail]]&&tail>=head)//同上
tail--;
qm[++tail]=i;
cout<<a[qm[head]]<<' ';
}
cout<<endl;
head=1;tail=1;
qm[head]=1;
for(int i=2;i<=k;i++)//同上,以下维护单调递增
{
while(a[i]>a[qm[tail]]&&tail>=head)
tail--;
qm[++tail]=i;
}
for(int i=k;i<=n;i++)
{
if(i-qm[head]==k)
head++;
while(a[i]>a[qm[tail]]&&tail>=head)
tail--;
qm[++tail]=i;
cout<<a[qm[head]]<<' ';
}
return 0;
}
P1158
合并果子
往年的一道noip题,思路还行...然而我被卡了差不多2天,本来想的思路对的,不知道怎么就想偏了。
总之就是没回从队中抽出最小的两个相加,出队,再将他们的和进队。说实话,如果不用STL,差不多就是一次一排序?或是二重?反正我没想出来....STL优先队列就很方便了
设一个小的优先级的队列,将最小的两个出队,在将他们的和进队。因为是n堆果子合并,所以实际只需合并n-1次
#include <bits/stdc++.h>
using namespace std;
struct cmp1
{
bool operator ()(int x, int y)
{
return x > y;//小的优先级高
}
};
priority_queue<int,vector<int>,cmp1>q;
int n,a,ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
q.push(a);
}
for(int i=1;i<=n-1;i++)
{
int x,y;
x=q.top();
q.pop();
y=q.top();
q.pop();
q.push(x+y);
ans+=x+y;
}
cout<<ans<<endl;
return 0;
}
P1159 假日
usaco原题。。。感觉我现在想不到算法,决定学完dp再回来补敲
单调队列练习题(oj p1157 p1158 p1159)的更多相关文章
- 【POJ 2823 Sliding Window】 单调队列
题目大意:给n个数,一个长度为k(k<n)的闭区间从0滑动到n,求滑动中区间的最大值序列和最小值序列. 最大值和最小值是类似的,在此以最大值为例分析. 数据结构要求:能保存最多k个元素,快速取得 ...
- 2018.10.14 bzoj1915: 奶牛的跳格子游戏(单调队列优化dp)
传送门 NOIP练习题. f[i]f[i]f[i]表示去的时候选了iii且回来的时候第一步走的是i−1i-1i−1的最优值. 显然f[i]=maxf[i]=maxf[i]=max{f[j]−sum[j ...
- zstu 4237 马里奥的求救——(单调队列DP)
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4237 这题可以转化为每次可以走g~d+x步,求最大分数,且最大分数的步数最少. ...
- Codeforces - 1195E - OpenStreetMap - 单调队列
https://codeforc.es/contest/1195/problem/E 一个能运行但是会T的版本,因为本质上还是\(O(nmab)\)的算法.每次\(O(ab)\)初始化矩阵中的可能有用 ...
- 单调队列练习题解(切蛋糕&好消息,坏消息)
单调队列的练习题解 前言: 在上一篇学习记录中,单调队列给出了几道练习题,因为这两道题的算法以及思路相差无几(几乎可以算是双倍经验quq),所以就在这里集中写一下相关的题解 前置知识: 见:队列专题( ...
- Sliding Window - 题解【单调队列】
题面: An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving fr ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
随机推荐
- 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
步骤:打开IE工具-->Internet选项-->安全-->自定义级别 -->找到ActiveX 控件和插件,按照图里进行配置.
- POJ 3693 Maximum repetition substring(最多重复次数的子串)
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10461 Ac ...
- Android:Google出品的序列化神器Protocol Buffer使用攻略
习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式 ...
- 安卓和html的互相调用
1.写html和安卓布局 <Button android:id="@+id/btn" android:layout_width="wrap_content" ...
- Linux重定向: > 和 &> 区别
总结:>只能将正常信息重定向 &>可以将错误信息或者普通信息都重定向输出(下面是实测) [root@Dev_yang shellScript]# lll -bash: lll: c ...
- SpringBoot入门学习(一): Idea 创建 SpringBoot 的 HelloWorld
创建项目: 项目结构: 程序启动入口: 正式开始: package com.example.demo; import org.springframework.boot.SpringApplicatio ...
- Spring学习--依赖注入的方式
Spring 依赖注入: 属性注入(最常使用) 构造函数注入 工厂方法注入(很少使用,不推荐) 属性注入:通过 setter 方法注入 Bean 的属性值或依赖的对象 , 使用<property ...
- 【uva11019-Matrix Matcher】AC自动机+优化+记录
http://acm.hust.edu.cn/vjudge/problem/33057 题意:在二维文本串T中查找一个二维模板串P出现了多少次. 题解: 拆分模板串P的每一行,建AC自动机.拆分文本串 ...
- thinkphp 导入微信小程序加密解密库
第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的 ...
- NPOI的使用Excel模板导出 可插入到指定行
Excel模版建议把需要添加数据行的样式设置好 模版样式,导出后效果 [2017-11-22 对获取需插入数据的首行样式有时为空报错修改] /// <summary> /// 根据模版导出 ...