P1917 -- 探险

时间限制:1000MS      内存限制:131072KB

题目描述(explore.cpp)

π+e去遗迹探险,遗迹里有 N 个宝箱,有的装满了珠宝,有的装着废品。

π+e手上有 n+e的地图,所以他知道每一个宝箱的价值,但是他不喜欢走回头路,所以要按顺序拿这 N 个宝箱中的若干个。

但是拿宝箱很累的。一开始 π+e的体力是 1, 每得到一个宝箱之后, π+e得到的价值是体力 × 宝箱的价值,之后他的体力就会变为原来的 k倍 (0<k<1)。

π+e 不喜欢连续放过很多宝箱,所以任意一段长度为 M 的序列中, π+e 一定要取走其中的一个宝箱。

现在 π+e 想知道他能得到的最大价值和。

输入格式(explore.in)

第一行,两个整数 N,M,表示的含义如题目中所述;

第二行,一个小数 k,表示的含义如题目中所述,最多 4 位小数;

第三行,N 个整数,第 i 个整数表示第 i个宝箱的价值。

输出格式(explore.out)

输出一行,一个实数,表示 π+e 能得到的最大价值和,四舍五入保留两位小数。

样例输入

3 2
0.1
1 2 3

样例输出

2.30

数据规模与约定

【样例解释】 取第 2 个和第 3 个宝箱,则价值和为 2×1+3×0.1=2.3

【数据规模与约定】

对于 30% 的数据,有 1≤N≤10;

对于 60% 的数据,有 1≤N≤1000;

对于 100% 的数据,有 1≤N≤100000,1≤M≤N,0<k<1,-10^9≤所有宝箱的价值 ≤10^9 。

建议在程序运行过程中使用 double 类型存储数据


題好像並沒有多難,但是看到以後沒有什麼思路,還是做題太少,抄題解太多,

在某次取完后所有後面的結果都會乘上k,而且和後面取多少個無關,所以逆推,每次取的時候給它乘一個k再加上a[i],

f[i]=max(f[j]*k+a[i]) (i<j<=i+m)

用單調隊列維護一個區間最大值即可

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,m,a[maxn];
int q[maxn],head=,tail=;
double k,f[maxn]; int main()
{
scanf("%d%d%lf",&n,&m,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]); for(int i=n;i>=;i--){
while(head<=tail && q[head]>m+i)head++;
while(head<=tail && f[q[tail]]<f[i+])tail--;
q[++tail]=i+;
f[i]=f[q[head]]*k+a[i];
}
double ans=-0x7fffffff;
for(int i=;i<=m;i++)ans=max(ans,f[i]);
printf("%.2lf\n",ans);
}

[題解](單調隊列dp)【2016noip福建夏令營】探險的更多相关文章

  1. [題解](單調隊列dp)luogu_P1725琪露諾

    比較簡單的單調隊列,但是有一些要注意的 維護單調隊列的時候裡面存的是入隊時間,而不是i,因為前面有l個沒有入隊(不可能走進),所以把i减一个l以达到延迟入队的效果 #include<bits/s ...

  2. bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列

    1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 331  Solved: 149[Submit][Stat ...

  3. [題解](二分答案/單調隊列)luogu_P1419尋找段落

    果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有 ...

  4. [題解](單調隊列/水)luogu_P3088擠奶牛

    d長度內區間最大值,單調隊列維護即可 由於需要滿足左右同時有2倍高度的牛才能更新答案,所以正反跑兩次 #include<bits/stdc++.h> using namespace std ...

  5. linux下c++實現簡單的生產者消費者隊列模式

    引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區 ...

  6. [題解]luogu_P3205/BZOJ_1996 合唱隊

    前言:基本上發題解的都是抄的題解所以 來源:題解 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个 ...

  7. [題解](DP)CF713C_Sonya and Problem Wihtout a Legend

    對於不嚴格單調的我們可以n^2DP,首先每個數一定在原數組中出現過,如果沒出現過不如減小到出現過的那個花費更小,效果相同 所以f[i][j]表示把i改到離散化后j的最小代價,每次維護前一狀態最小值mn ...

  8. [題解]luogu_P1120小木棍(搜索)

    好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...

  9. B. Psychos in a Line 解析(思維、單調棧)

    Codeforce 319 B. Psychos in a Line 解析(思維.單調棧) 今天我們來看看CF319B 題目連結 題目 給一個數列,如果相鄰兩數,左邊大於右邊,那麼就可以殺死右邊的數字 ...

随机推荐

  1. Disruptor学习杂记

    慎入,有点乱,只是学习记录,disruptor_2.10.4 1.Disruptor对象有一个EventProcessorRepository对象   2.EventProcessorReposito ...

  2. Eclipse快捷键【转载】

    分享一前辈的博客-Eclipse快捷键

  3. bzoj4474: [Jsoi2015]isomorphism

    树hash啊 我的做法很垃圾,就是yy一种只有一个孩子时hash值和孩子一样的hash法 然后用重心去作为根遍历 这样有点问题,就是重心假如也是要删掉的那就gg了 那我们求tot的时候删掉的点就不管直 ...

  4. POJ 2506 Tiling (递推 + 大数加法模拟 )

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7965   Accepted: 3866 Descriptio ...

  5. 分布式session之redis解决方案实现

    一.首先Session Session 是客户端与服务器通讯会话技术, 比如浏览器登陆.记录整个浏览会话信息.session存放在服务器,关闭浏览器不会失效. Session实现原理 客户对向服务器端 ...

  6. 关于Javascript中声明变量、函数的笔记

    一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1, ...

  7. mysql的navicat注册码生成

    首先下载安装Navicat在Navicat关闭的情况下运行注册机在注册机界面点击patch,选择Navicat安装目录下的Navicat.exe打补丁弹出破解成功后拔掉网线断网products选择my ...

  8. android中获取包名,类名

    LogUtil.i("getPackageName()=" + getPackageName()); //Context类 LogUtil.i("getClass().g ...

  9. 图片预览JavaScript方法

    实现要点   ● 对于 Chrome.Firefox.IE10 使用 FileReader 来实现. ● 对于 IE6~9 使用滤镜 filter:progid:DXImageTransform.Mi ...

  10. H3C-端口镜像

    本地端口镜像配置举例 配置Switch: <Sysname> system-view [Sysname] mirroring-group 1 local # 创建本地镜像组 [Sysnam ...