P3572 [POI2014]PTA-Little Bird
P3572 [POI2014]PTA-Little Bird
一只鸟从1跳到n。从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制k,求每次最少耗费多少体力
很简短的题目哼。
首先对于一个点, 他的状态一定是由前 \(k\) 个转移过来的。 \(k\) 的长度在每组询问内一定, 想到用单调队列维护 \(dp\) 。
不过此时单调队列里的元素有两个关键字: 劳累度和高度, 因为跳到比这个点高的树需要花费恒为一点体力(这个很重要), 所以我们维护单调队列的时候可以以劳累度为第一关键字, 高度为第二关键字进行比较, 为多个关键字的单调队列
解释一下为什么体力花费恒为一点很重要。 这里运用了一点贪心的思想: 此题的高度对体力消耗没有影响, 只有高和矮两种说法。 只要我的劳累值比你小, 不管你的高度有多低, 我 $ + 1$ 一定 \(<=\) 你, 所以可以把高度作为第二关键字比较, 从而不影响结果
Code
教训: 多次调用简单函数会大大降低算法的效率, 开一波 \(O2\) 才没 \(T\) 。
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int RD(){int flag = 1, out = 0;char c = getchar();while(c < '0' || c > '9'){if(c == '-')flag = -1;c = getchar();}while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}return flag * out;}
const int maxn = 1000019;
int len, num ,k;
int h[maxn];
int dp[maxn];
struct Que{int h, val, index;Que (int h, int val, int index): h(h), val(val), index(index){}Que(){};bool operator < (Que const &a)const{if(val != a.val)return val < a.val;return h > a.h;}}Q[maxn];
int head, tail;
void push_back(Que x){while(head <= tail && x < Q[tail])tail--;Q[++tail] = x;}
void check(int x){while(x - Q[head].index > k)head++;}
int get_min(){return Q[head].val;}
int main(){len = RD();for(int i = 1;i <= len;i++)h[i] = RD();num = RD();while(num--){k = RD();head = 1, tail = 0;Q[head] = Que(1e9 + 19, 0, 0);memset(dp, 0, sizeof(dp));for(int i = 1;i <= len;i++){check(i);if(h[i] < Q[head].h)dp[i] = get_min();else dp[i] = get_min() + 1;push_back(Que(h[i], dp[i], i));}printf("%d\n", dp[len]);}return 0;}
转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9339048.html
P3572 [POI2014]PTA-Little Bird相关推荐
- 洛谷P3572 [POI2014]PTA-Little Bird
P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...
- 【BZOJ 3831】【Poi2014】Little Bird(单调队列优化dp)
题干: Description In the Byteotian Line Forest there are trees in a row. On top of the first one, th ...
- 【BZOJ3831】[Poi2014]Little Bird 单调队列
[BZOJ3831][Poi2014]Little Bird Description In the Byteotian Line Forest there are trees in a row. ...
- C语言 之 PTA乙级错误集锦
1,很大很大的数输入,并各位加和 PTA-1001 #include <stdio.h> #include <math.h> int main(){int sum=0,cou ...
- PTA数据结构与算法题目集6-4 6-3 6-8
PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...
- PTA数据结构与算法题目集 6-9 二叉树的遍历
PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...
- PTA 家庭房产 (图论,暴搜)
PTA 家庭房产 (图论,暴搜) 题目详情: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N ...
- PTA—输出全排列 (20分) 递归回溯思想
PTA-输出全排列 (20分) 递归回溯思想 题目要求: 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出 ...
- 人形图案c语言程序_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...
经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...
最新文章
- asp.net导出到Excel的最佳选择
- Office转PDF,Aspose太贵,怎么办?
- debian9为什么默认是pip2_Debian9 安装后基本配置
- jquery 如何动态添加、删除class样式方法介绍_jquery_脚本之家
- 黑鲨4游戏手机开启预热:4>5+6+7 比竞品更胜一筹
- linux 解压文件zip格式
- 单张图片上传预览【超简洁,未完待续】
- KDE桌面没有wifi的解决方案
- 西门子S7-1200系列PLC Modbus通信的踩坑记录
- U盘文件夹被病毒隐藏了
- CommonAPI 使用说明文档
- python冒号_python数组冒号取值操作
- 日记(菜的连比赛都参加不了)
- 客户细分是客户关系管理的重要手段
- (2)QlikView安装
- QT延时函数sleep
- IDEA的配置设置及使用
- 并查集——加边的无向图
- Oracle 常用的V$ 视图脚本
- mui native.js 调用本地视频播放器