1004 抄作业
     
 
Time Limit: 1sec    Memory Limit:256MB
Description

Zfree虽然平时很爱学习,但是他迫于生活所迫(比如设计cpu实验啊),这周数分作业只能抄答案了。

可是这是他第一次抄作业题目又多,于是他有些不想抄,因为他想玩会游戏再抄,于是他打算用一定的时间去抄作业(当然也可以不用完)。

而这可能抄不完,所以他会选择跳过几题不抄,为了尽量不被老师发现,他想知道他抄写的两题的题号最大间隔最小是多少?(间隔包括他第一个抄的题目前面的题目数量 和 最后一个题目后面的题目数量)

Input

第一行 T,n 表示可以用来抄题目的总时间和题目数量(T,n<10^5)

第二行 n个数字,第i个数字表示抄写第i题要用的时间数(a[i]<T)

Output

一个数字k,表示最多隔k题抄一题可以用T时间抄完题目

Sample Input 
 
10 5
5 3 6 1 3
 
Sample Output
 
1

题意:n个数,选取若干个数,其中两个数之间的间隔最大为k,问k最小是多少。

题解:

要最大值最小,二分k,然后dp判断当前的k是否可行。
设dp[i]表示最大间隔不超过k的前提下,前i道题目中,选了第i道题,所用的最短时间。
dp[i]=min(dp[j])+time[i], i-k-1<=j < i
这个方程最坏情况是n^2的,但这种形式的方程我们可以用一个单调队列来优化。对于当前的i,队列q储存的可能的j值,满足其dp值递增,每次先判断对首的元素是否>=i-k-1,不满足则出队;用队首元素更新dp[i];若队尾的元素的dp值大于dp[i]则出队(这些元素此后都一定没有i优,不可能用于更新其他dp值),再把i放到队尾。这样总的复杂度就是O(nlogn)的。

 #include<bits/stdc++.h>
using namespace std; const int N=;
int a[N],f[N],g[N];
int t,n; void init()
{
scanf("%d%d",&t,&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
a[n+]=;
} bool check(int k)
{
//f[i]=min(f[j])+a[i]; (i-k-1 <= j <= i-1)
int l=,r=;
f[]=;g[]=;
for(int i=;i<=n+;i++)
{
while(l<=r && g[l]<i-k-) l++;
f[i]=f[g[l]]+a[i];
while(l<=r && f[g[r]]>f[i]) r--;
g[++r]=i;
}
return f[n+]<=t;
} void solve()
{
int l=,r=n,mid;
while(l<r)
{
mid=(l+r)/;
if(check(mid)) r=mid;
else l=mid+;
}
printf("%d\n",l);
} int main()
{
//freopen("a.in","r",stdin);
init();
solve();
return ;
}

[acmm week12]二分+dp+单调队列的更多相关文章

  1. bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】

    把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i- ...

  2. luogu P3657 (NOIP2017) 跳房子(二分+DP+单调队列)

    题面 传送门 分析 显然答案有单调性,可以二分答案,设当前二分值为g,根据题意我们可以求出跳跃长度的范围[l,r] 考虑DP 子状态: dp[i]表示跳到第i个点时的最大和 状态转移方程 \(dp[i ...

  3. 【BZOJ 2806】 2806: [Ctsc2012]Cheat (SAM+二分+DP+单调队列)

    2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1262  Solved: 643 Description ...

  4. [NOIP2017普及组]跳房子(二分,单调队列优化dp)

    [NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...

  5. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

  6. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  7. DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)

    codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Descripti ...

  8. BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列

    BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列 题意: 分析: 拆成链,二分答案,奇偶两个单调队列维护最大子段和,记录方案. 代码: #include <cstdio&g ...

  9. 习题:烽火传递(DP+单调队列)

    烽火传递[题目描述]烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有n个烽火台,每个烽火台 ...

随机推荐

  1. Eclipse项目导入到Android Studio中

    背景 最近需要将Eclipse中的android项目导入到Android Studio中!倒腾一番,记录如下! 步骤1 打开Android Studio(下文称AS),选择Import project ...

  2. 蜗牛慢慢爬 LeetCode 3. Longest Substring Without Repeating Characters [Difficulty: Medium]

    题目 Given a string, find the length of the longest substring without repeating characters. Examples: ...

  3. CNN误差反传时旋转卷积核的简明分析(转)

    CNN(卷积神经网络)的误差反传(error back propagation)中有一个非常关键的的步骤就是将某个卷积(Convolve)层的误差传到前一层的池化(Pool)层上,因为在CNN中是2D ...

  4. 2nd 本周例行报告

    每周例行报告 1.个人项目:词频统计更新 C类型 C内容 S开始时间 E结束时间 I间隔(min) T净时间(min) 分析 功能分析 8:30 10:00 20 70 学习 查阅资料 10:00 1 ...

  5. javascript与python的比较

    1:javascript与python大小写皆敏感 2:javascript使用{}来组织代码块,与大部分语言相同  python使用缩进来组织代码块,与大部分语言不同,请务必遵守约定俗成的习惯,坚持 ...

  6. PHP面向对象之重载

    重载技术overloading 重载的基本概念 重载在“通常面向对象语言”中的含义: 是指,在一个类(对象)中,有多个名字相同但形参不同的方法的现象: 类似这样: class   C{ functio ...

  7. Maven学习——1、安装与修改Maven的本地仓库路径

    1.1.下载 官网 http://maven.apache.org/download.cgi 1.2.安装配置 apache-maven-3.3.3-bin.zip 解压下载的压缩包 1.3.配置环境 ...

  8. MySQL5.7初始配置

    MySQL5.7初始配置 Windows7 环境安装MySQL5.7配置命令 <<<<<<<<<<<<<<<& ...

  9. HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)

    HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...

  10. 【bzoj3687】简单题

    #3687. 简单题 内存限制:512 MiB时间限制:10 Sec 提交提交记录讨论 题目描述 小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和.2.子集的异或和的异或和 ...