1 条题解

  • 0
    @ 2023-10-18 10:01:04

    C++ :

    #include<bits/stdc++.h>
    using namespace std; 
    const int N=50010;
    int n,m;
    int w[N];
    int f[N],q[N];
    bool check(int x)
    {
    	int hh=0,tt=-1;
    	q[++tt]=0;
    	for(int i=1;i<=n;i++)
    	{
    		while(hh<=tt&&i-q[hh]+1>x+2) hh++; //空白题目+2个已做题
    		f[i]=f[q[hh]]+w[i]; //更新答案
    		while(hh<=tt&&f[q[tt]]>=f[i]) tt--; //维护单调队列
    		q[++tt]=i;
    	}	
    	int res=2e9;
    	for(int i=n-x;i<=n;i++)
    	{
    		res=min(res,f[i]);
    	}
    	return res<=m; //判断是否小于给定时间
    } 
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>w[i];
    	}
    	int l=0,r=n;
    	while(l<r)
    	{
    		int mid=(l+r)/2;
    		if(check(mid)) r=mid;
    		else l=mid+1;
    	}
    	cout<<r;
    	return 0;
    }
    
    • 1

    信息

    ID
    775
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者