首页 > 其他分享 >D1 - The Endspeaker (Easy Version)

D1 - The Endspeaker (Easy Version)

时间:2024-10-28 22:58:13浏览次数:1  
标签:... maxx Version int Endspeaker vector Easy inf dp

题意:给出长为n的数组a,长为m的数组b和数字k,k初始值为1。每次可以执行以下两种操作之一:

1. 当k<=m时,k++;

2. 删除a前缀和小于等于b[k]的部分,同时cost+=m-k;

求删完a的最小cost;如果不能删完a,输出-1.

解:首先a最大值大于b[1]时无解。一开始想的是贪心,对于每一段a[i...j],如果其max(a[j...n])>=b[k+1]且sum(a[j...n])<=b[k],那么算一次贡献,否则寻找最合适的k。然后WA test3了,想了一下是因为可以选择更大的b[k],使得一次删除的数更多,从而贡献更少。

那么只能dp了。令dp[i][j]为删到第i个数,k=j时贡献最小值,那么有:

dp[i][j]=min(dp[i][j],dp[p][k]+m-j)         where sum[p+1...i]<=b[j] && k<=j 可以看到p<i,那么是从p<i且k<=j的一个矩阵里转移。首先p应该选择尽可能靠左的数,sum[p+1...i]这一段应尽可能大,这可以用二分解决。接下来p固定了,只需要从该列中选择最小的数,于是每次更新行的时候同时维护每列最小值即可。 代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxx 300005
#define inf 0x3f3f3f3f
int n,m;
int a[maxx]={0},b[maxx]={0};
ll sum[maxx]={0};
signed main(){
    int T;
    scanf("%d", &T);
    while (T--){
        scanf("%d%d",&n,&m);
        int maxa=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            maxa=max(maxa,a[i]);
            sum[i]=sum[i-1]+a[i];
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&b[i]);
        }
        if(maxa>b[1]){
            printf("-1\n");
            continue;
        }
        vector<vector<ll>> dp(n+1,vector<ll>(m+1,inf));
        vector<vector<ll>> p(n+1,vector<ll>(m+1,inf));
        for(int i=1;i<=m;i++) dp[0][i]=0;
        for(int i=1;i<=m;i++) p[0][i]=0;

        for(int i=1;i<=n;i++) {
            for(int j=1;j<=m;j++){
                if(a[i]>b[j]) break;
                int l=1,r=i,mid,ans;
                while(l<=r){
                    mid=l+(r-l)/2;
                    if(sum[i]-sum[mid-1]<=b[j]){
                        ans=mid;
                        r=mid-1;
                    }
                    else
                        l=mid+1;
                }
                dp[i][j]=min(dp[i][j],p[ans-1][j]+m-j); 
            }
            for(int j=1;j<=m;j++){
                p[i][j]=min(dp[i][j],p[i][j-1]);
            }
        }
        // for(int i=1;i<=n;i++){
        //     for(int j=1;j<=m;j++){
        //         printf("%lld ",dp[i][j]);
        //     }
        //     printf("\n");
        // }
        ll ans=inf;
        for(int j=1;j<=m;j++) ans=min(ans,dp[n][j]);
        printf("%lld\n",ans);
        // printf("\n");
    }
}

// dp[i][j] to pos i, with k=j, min cost
// dp[i][j]=min(dp[i][j],dp[p][k]+m-j) where sum[p+1...i]<=b[j] && k<=j
// p越靠左越好,可二分
// 
View Code

 

 

标签:...,maxx,Version,int,Endspeaker,vector,Easy,inf,dp
From: https://www.cnblogs.com/capterlliar/p/18511881

相关文章

  • GA/T1400视图库平台EasyCVR视频设备轨迹回放平台智慧园区视频监控方案
    信息技术的持续进步和城市化进程的加快,使得作为城市发展关键组成部分的智慧园区对监控安全和智能管理的需求日益增长。GA/T1400视图库平台EasyCVR推出的智慧园区视频监控方案正是为了满足这一需求而设计的。该方案整合了高清视频监控、智能分析和远程管理等尖端技术,为智慧园区在安......
  • 大华设备视频平台EasyCVR私有化视频平台云端录像、监控存储、回看、计划与配置功能全
    EasyCVR是TSINGSEE青犀视频在音视频流媒体技术和人工智能领域的深入研发成果,它以出色的视频处理、汇聚和融合能力,在构建视频监控系统方面表现出独特的优势。大华设备视频平台EasyCVR能够接入高清网络摄像机的RTSP直播流,并且支持多种其他直播流格式,例如RTMP、HTTP-FLV、HLS(M3U8)......
  • Java EasyExcel 导出报内存溢出如何解决
    大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。你有遇到过这种情况吗,以下是V哥整理的解决该问题的一些常见方法,分享给大家,欢迎一起讨论:EasyExcel大数据量导出常见方法1.分批写入EasyExcel支持分批写入数据,可以将数据分批......
  • 海康私有化视频平台EasyCVR视频设备轨迹回放平台不同品牌网络摄像机怎么搭配使用?
    一、不同品牌的录像机和摄像机可以混搭使用吗?通常情况下,这是可行的:市面上的大多数摄像头和录像设备都兼容ONVIF协议,该协议定义了网络视频的模型、接口、数据类型以及数据交换的方式。ONVIF协议的目的是建立一个网络视频的框架协议,确保不同制造商生产的网络视频产品(例如摄像设备和......
  • NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案
    一、方案背景智慧小区构成了“平安城市”建设的基石。随着社会的进步,社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前,许多小区的物业管理和安全防护系统仍然较为简单和陈旧,加之人力资源有限,这些因素导......
  • GA/T1400视图库平台EasyCVR视频设备轨迹回放平台智慧园区视频监控方案
    信息技术的持续进步和城市化进程的加快,使得作为城市发展关键组成部分的智慧园区对监控安全和智能管理的需求日益增长。GA/T1400视图库平台EasyCVR推出的智慧园区视频监控方案正是为了满足这一需求而设计的。该方案整合了高清视频监控、智能分析和远程管理等尖端技术,为智慧园区在安......
  • 海康私有化视频平台EasyCVR视频设备轨迹回放平台不同品牌网络摄像机怎么搭配使用?
    一、不同品牌的录像机和摄像机可以混搭使用吗?通常情况下,这是可行的:市面上的大多数摄像头和录像设备都兼容ONVIF协议,该协议定义了网络视频的模型、接口、数据类型以及数据交换的方式。ONVIF协议的目的是建立一个网络视频的框架协议,确保不同制造商生产的网络视频产品(例如摄像设备和......
  • 大华设备视频平台EasyCVR私有化视频平台云端录像、监控存储、回看、计划与配置功能全
    EasyCVR是TSINGSEE青犀视频在音视频流媒体技术和人工智能领域的深入研发成果,它以出色的视频处理、汇聚和融合能力,在构建视频监控系统方面表现出独特的优势。大华设备视频平台EasyCVR能够接入高清网络摄像机的RTSP直播流,并且支持多种其他直播流格式,例如RTMP、HTTP-FLV、HLS(M3U8)......
  • linux 内核 LINUX_VERSION_CODE 和 KERNEL_VERSION 宏定义 版本信息
    由于Linux版本的在不断更新,当设备驱动去兼容不同版本的内核时,需要知道当前使用的内核源码版本,以此来调用对应版本的内核API,这两个宏定义在文件/usr/include/linux/version.h#defineLINUX_VERSION_CODE263213#defineKERNEL_VERSION(a,b,c)(((a)<<16)+((b)<<8)+(c))我安......
  • DRF-Version组件源码分析
    1.版本管理组件源码分析注意点:不同的versioning_class区别:实例化后得到的对象versioning_scheme里面的方法不同(函数同名,但是处理逻辑不同)defdetermine_version:获取版本信息defreverse:反向生成url;QueryParameterVersioning:代表版本信息在查询参数中URLPathVersioni......