正题


大意

每个人有两个值gigig_i和hihih_i,要求将序列分解成连续的几个序列。要求每个序列最大的hihih_i的和小于Limt的情况下每个序列gigig_i的和的最大值最小。


解题思路

我们二分最小的gigig_i的和的最大值
首先一个O(n2)O(n2)O(n^2)的dp想法,用fifif_i表示分割到第i个时最大的hihih_i的和的最小值。
动态转移:

fi=min{f[j]+max{hj,hj+1,hj+2...hi−1,hi}}fi=min{f[j]+max{hj,hj+1,hj+2...hi−1,hi}}

f_i=min\{f[j]+max\{h_j,h_{j+1},h_{j+2}...h_{i-1},h_i\}\}

我们考虑如何优化,每次有新的max只会在产生更大的hihih_i时,于是我们可以用一个nextinextinext_i表示最近的hnext>hihnext>hih_{next}>h_i,然后我们可以二分快速找到满足小于你目前二分到的答案的最小的位置。
时间复杂度O(n2+n  (log n)2)O(n2+n(logn)2)O(n^2+n\ \ (log\ n)^2)
是不是感觉时间复杂度没有变化,巧了!它就是A了


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#define H 20010
#define ll long long
using namespace std;
int n,h[H],g[H],z[H],next[H],num[H],tot;
ll sum[H],L,f[H],ans,l,r;
int find(int x,int need)//二分满足条件的最小值
{int l=x,r=n;while(l<r){int mi=(l+r)/2;if(sum[mi]-sum[x-1]>=need) r=mi;else l=mi+1;}return l;
}
bool check(int x)
{memset(f,127/3,sizeof(f));f[1]=0;for (int i=1;i<=n;i++)//dp{int k=find(i,x),y=i,add=h[y];if (sum[k]-sum[i-1]>x) k--;while(y<=k){f[y]=min(f[y],f[i]+add);add=h[y];y=next[y];}f[k+1]=min(f[k+1],f[i]+add);}return f[n+1]<=L;
}
int main()
{scanf("%d%lld",&n,&L);for(int i=1;i<=n;i++){scanf("%d%d",&h[i],&g[i]);sum[i]=sum[i-1]+g[i];}num[1]=n+1;z[1]=2147483647;tot=1;for (int i=n;i;i--)//暴力next数组{while (z[tot]<=h[i]) tot--;next[i]=num[tot];++tot;num[tot]=i;z[tot]=h[i];} l=1;r=sum[n];ans=r;while(l<=r)//二分{int mid=(l+r)>>1;if (check(mid)) {if (mid<ans)ans=mid;r=mid-1;}else l=mid+1;}printf("%lld",ans);
}

jzoj3463-军训【双重嵌套二分,随机数据水法】相关推荐

  1. 24点游戏(随机产生四个不同的1到13的随机数据外加加减乘除构成表达式,输出结果等于24的表达式)

    一.题目内容 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决2 ...

  2. MySQL查询随机数据的4种方法和性能对比

    从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用"ORDER BY RAND()",本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并 ...

  3. 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...

  4. 设置 mock_【学习】接口测试-使用mock生产随机数据

    在做接口测试的时候,有的接口需要进行大量的数据进行测试,还不能是重复的数据,这个时候就需要随机生产数据进行测试了.这里教导大家使用mock.js生成各种随机数据. 一.什么是mock.js mock. ...

  5. python 使用 sorted 对 列表嵌套元组的数据进行排序

    在开发的过程可能会遇到这么一个需求,存在一个列表嵌套元组的数据: data = [(1, 'a'),(2, 'b'),(5, 'c'),(3, 'd'),(4, 'e')] 需要将这个列表按照元组的第 ...

  6. 嵌套的JSON数据与AVRO文件的相互转换

    JSON是一种常用的数据交换格式,很多系统都会使用JSON作为数据接口返回的数据格式,然而,由于JSON数据中包含大量的字段名字,导致空间的严重浪费,尤其是数据文件较大的时候,而AVRO是一种更加紧凑 ...

  7. 生成特定分布随机数的方法:Python seed() 函数numpy scikit-learn随机数据生成

    描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数.. 语法 以下是 seed() 方法的语法: import random random.seed ( [x] ...

  8. python随机划分数据集_Python之机器学习-sklearn生成随机数据

    sklearn-生成随机数据 import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotli ...

  9. mysql数据表中取几列_MySQL实现表中取出随机数据

    MySQL是开放源代码,MySQL因为其速度.可靠性和适应性而备受关注.大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择. 那么如何在MySQL实现表中取出随机数据呢? SEL ...

最新文章

  1. 从“元宇宙”热炒中理性看待我国虚拟现实产业发展
  2. spss聚类分析_SPSS聚类分析 I K均值聚类法案例实操
  3. 网站如何布局才能更利于提升用户体验?
  4. OSChina 周三乱弹 ——是不是兄弟?是兄弟就帮我解决下!
  5. xml 和android脚本之家,AndroidManifest.xml配置文件解析_Android_脚本之家
  6. PHP中的get_defined_funciton和get_defined_vars
  7. js 把字符串格式化成时间
  8. mysql 防火墙 centos_CentOS 开启防火墙 firewall ,mysql 远程访问
  9. 【图像检索】基于matlab GUI综合颜色和形状特征图像检索【含Matlab源码 395期】
  10. 拦截器和过滤器之间的区别
  11. 关于求余运算(余数为正)
  12. CC1310在433MHz下的PCB设计指南
  13. eda交通灯控制器波形输入_EDA实验报告实验四:交通灯控制器设计
  14. 突破SBO屏蔽限制,自由实现快捷键自定义
  15. 流媒体技术基础-流媒体文件格式
  16. 机器学习期末考试满分试卷答案
  17. 5分钟_SpringBoot集成ES实现存储、查询
  18. 牛客练习赛97_D 月之暗面
  19. 你知道各调的特点吗?
  20. (附源码)计算机毕业设计SSM基于的楼盘销售系统的设计与实现

热门文章

  1. java调试案例_Spring-boot的debug调试代码实例
  2. 简单计算机面试题库及答案_计算机专业复试面试问题含答案
  3. 截获android屏幕服务,如何捕获android设备屏幕内容?
  4. php去掉查询返回的字段序列,php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回...
  5. 367. 有效的完全平方数(二分法)
  6. java当中用UDP实现相互交流
  7. 7-16 一元多项式求导 (20 分)(详解+题目分析)
  8. [Swagger2]分组和接口注释及小结
  9. SQL5 将查询后的列重新命名(数据库的几种去重方法)
  10. 蜘蛛牌 HDU - 1584(搜索——达到先让某些段先结合,达最优解)