首页 > 其他分享 >D. Blocking Elements

D. Blocking Elements

时间:2024-03-15 16:44:07浏览次数:24  
标签:Elements ll cin 100005 maxlen pres Blocking dp

原题链接

题解

最大值最小化,想到了二分
而对于一个二分到的 \(\mathscr{maxlen}\) 而言,如何判断是否存在一种分法使得最大值不大于它?

对于一个给定的二分值而言,要想成功有两个约束条件,一个是间断值不超过 \(\mathscr{maxlen}\) ,一个是选中值之和不超过 \(\mathscr{maxlen}\)

由此我们让第一个条件作为约束条件来寻找第二个条件是否成立
这里太巧妙了!!!!
设 \(dp[i]\) 为选中 \(i\) ,且 \(i\) 之前的间断值都不超过 \(maxlen\) 的最小值
\(dp[i]\) 是由前面间断值不大于 \(maxlen\) 的最小的 \(dp[i]\) 转移而来的
然后判断 \(dp[n+1]\) 有没有大于 \(maxlen\)

真的太巧妙了!!!

code

···

include<bits/stdc++.h>

define ll long long

using namespace std;

ll n;
ll a[100005]={0};
ll pres[100005]={0};
ll dp[100005]={0};
struct node
{
ll x;
bool operator<(const node &b) const{return dp[x]>dp[b.x];}
};
ll check(ll maxlen)
{

priority_queue<node> q;
q.push({0});
a[n+1]=0;
for(ll i=1;i<=n+1;i++)
{
    while(q.size()&&pres[i-1]-pres[q.top().x]>maxlen) q.pop();
    ll x=q.top().x;
    dp[i]=dp[x]+a[i];
    q.push({i});
}
if(dp[n+1]>maxlen)  return 0;
return 1;

}
int main()
{
ll t;
cin>>t;
while(t--)
{
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
pres[i]=pres[i-1]+a[i];
}

    ll l=0,r=pres[n];
    while(l+1<r)
    {
        ll mid=(l+r)/2;
        if(check(mid))r=mid;
        else l=mid;
    }

    cout<<r<<endl;
}
return 0;

}

···

标签:Elements,ll,cin,100005,maxlen,pres,Blocking,dp
From: https://www.cnblogs.com/pure4knowledge/p/18075777

相关文章

  • 网页浏览器Chrome开发者调试工具-Elements(元素)
    前言全局说明网页浏览器Chrome开发者调试工具-Elements(元素)一、Elements(元素)网页内容都是以元素为单位,比如一行字等等二、页面选择元素在页面上想要查看源码的地方,鼠标右键-审查,就能打开源码对应位置。三、元素工具打开审查页面后,在工具左上角点击后,就可以在页面......
  • Blocking Elements
    这道题目打得我很郁闷。。为啥考试的时候明明想到算法了,只要在想深一点就可以解决问题了,但却没有这么做呢?看到求最小最大,想到二分,然后没有什么好的判断方法,又想到了DP设\(f[i]\)表示前\(i\)个数,选择第\(i\)个数到第一种序列里面,满足题意的第一种序列的最小值,有很明显的转移最......
  • Go 100 mistakes - #32: Ignoring the impact of using pointer elements in range lo
    Thissectionlooksataspecificmistakewhenusingarangeloopwithpointerelements.Ifwe’renotcautiousenough,itcanleadustoanissuewherewereferencethe wrongelements.Let’sexaminethisproblemandhowtofixit.Beforewebegin,let’scla......
  • Minimize OR of Remaining Elements Using Operations
    MinimizeORofRemainingElementsUsingOperationsYouaregivena 0-indexed integerarray nums andaninteger k.Inoneoperation,youcanpickanyindex i of nums suchthat 0<=i<nums.length-1 andreplace nums[i] and nums[i+1] withas......
  • JAVA并发之PriorityBlockingQueue
    PriorityBlockingQueue(优先阻塞队列)是Java并发包java.util.concurrent下面的一个工具类,它除了具有阻塞队列的功能外还具有以下特点:对队列中的元素进行排序,如果未指定比较器,插入队列的元素必须实现Comparable接口内部基于数组实现的最小二叉堆算法队列的长度是可扩展的(类似Ar......
  • 【Java 并发】【队列应用】【一】ArrayBlockingQueue 的使用-Logback异步日志打印
    1 前言看了那么多Java提供的队列工具,那么我们这节开始看看哪些地方用到了这些队列哈。这一节我们讲解logback异步日志打印中ArrayBlockingQueue的使用。2  异步日志打印模型概述在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了,这是因为......
  • 【Java 并发】【十】【JUC数据结构】【十】PriorityBlockingQueue 原理
    1 前言这节我们继续看看另一个队列 PriorityBlockingQueue,优先级的哈。2 PriorityBlockingQueue介绍PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使......
  • [Violation ] Added non-passive event listener to ascroll- blocking ‘mousewheel
    [Violation]Addednon-passiveeventlistenertoascroll-blocking'mousewheel’eventConsidermarkingeventhandleras’passive’tomakethepagemoreresponsive.--控制台报错解决方法这个错误翻译过来的的意思就是:[违规]在ascroll中添加了非被动事件侦听器-阻......
  • 并发容器【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】
    (并发容器)转自极客时间什么是并发容器?在JUC包中,有一大部分是关于并发容器的,如ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList及阻塞队列。这里将介绍使用频率、面试中出现频繁的最高的ConcurrentHashMap和阻塞队列。注意:这里说到的容器概念,相当于我们理解中......
  • [Go - slice] Remove Elements from a slice in Go
    Gohasaspecialindexingsyntaxthatformsthebasisofremovingoneormoreelementsfromaslice.Iwillteachyouthissyntaxandshowyouitsvariousforms.Baseduponthat,I'llshowyouhowtoremoveasingleelementfromaslice.However,you......