首页 > 其他分享 >ICPC WF 2022 2023 Bridging the Gap 过桥

ICPC WF 2022 2023 Bridging the Gap 过桥

时间:2024-10-16 21:11:06浏览次数:7  
标签:WF Bridging 10 int void 跑腿 Gap include NV

https://qoj.ac/problem/8683

https://loj.ac/p/6937

是个十足的 DP 题。刷完了 YeahPotato 的 DP 博客,你觉得有什么方法能套进来呢?

前面“基于特殊结构的技巧”没有一个能用。

如何分析性质?分析样例:

12 3
8 9 9 6 9 9 10 8 8 3 4 5

明显先排序。

3 4 5 6 8 8 8 9 9 9 9 10

猜想,一定有几个人在跑腿送灯,一定是前 C 个人的前缀,从对岸往回跑的一定是对岸用时最少的。

搓出几个看上去很全的策略:(| 左侧是跑腿,最终都往回跑)

(3,4,5|)(3)(6,8,8)(4)(8,9,9)(5)
(3,4|5)(3)(6,8,8)(4)
(3|4,5)

然而是不对的。实际上最优的是:

  1. 388 过去,3 回来;
  2. 345 过去,3 回来;
  3. 899 过去,4 回来;
  4. 346 过去,3 回来;
  5. 9 9 10 过去,4 回来;
  6. 34 过去。

8+3+5+3+9+4+6+3+10+4+4=59。

发现最终的行走方案不一定等于排序的。并且还是一次带 k 个跑腿 C-k 个(或 0 个)累赘,后面留着用,每次带累赘都要耗一个跑腿。最后是一群跑腿过去。

这里直接篡改顺序,按排序后的数组计算,贡献提前计算。

具体地,记 fi,j 表示考虑到第 i 个人,运完第 i 个后有 j 个跑腿在对岸待命,此时最小花费。转移枚举这回几个人跑腿即可。

最后的一群跑腿直接记在初值里面。

细节,由于篡改顺序,积累的跑腿可以多于 C,但不多于 N/C。转移为 C,复杂度 O(N×N/C×C)=O(N2)。

#include<cstdio>
#include<cstring>
#include<algorithm>

#define fi first
#define se second
#define mkp std::make_pair
using ll=long long;
using std::max;
using std::min;
template<class T> void cmax(T&a,T b){a=max(a,b);}
template<class T> void cmin(T&a,T b){a=min(a,b);}

const int NV=1e4;

namespace xm{
    ll s[NV+5],f[NV+5][NV+5];
    int a[NV+5];
    void _(){
        int N,C;

        scanf("%d%d",&N,&C);
        for(int i=1;i<=N;++i) scanf("%d",a+i);

        std::sort(a+1,a+N+1);
        for(int i=1;i<=N;++i) s[i]=s[i-1]+a[i];
        if(C>=N){
            printf("%d\n",a[N]);
            return;
        }

        memset(f,0x3f,sizeof f);
        f[0][0]=0;
        for(int i=1;i<=C;++i)f[i][0]=a[i];
        for(int i=0;i<=N;++i)
        for(int j=0;(j-1)*C<=N-i;++j)
        for(int k=0;k<=C&&k<=i;++k){
            if(k>0)
                cmin(f[i][j+k-1],f[i][j]+a[k]+s[k]);
            if(j+k&&k<C)
                cmin(f[min(i+C-k,N)][j+k-1],f[i][j]+a[min(i+C-k,N)]+s[k]);
        }
        printf("%lld\n",f[N][0]);
    }
}

int main(){
    xm::_();
    return 0;
}

标签:WF,Bridging,10,int,void,跑腿,Gap,include,NV
From: https://www.cnblogs.com/Zaunese/p/18470785

相关文章

  • Snowflake算法js(实现)
    Snowflake算法是一种分布式环境下的唯一ID生成算法,最初由Twitter开发并在其内部使用。该算法旨在生成全局唯一、递增的64位整数ID,同时具备高性能的特点。以下是Snowflake算法的一些关键特点及其工作原理:特点全局唯一性:生成的ID在分布式环境中几乎可以保证全局唯一。时间有......
  • AI智能照片放大软件--Topaz Gigapixel AI macOS苹果电脑安装包(含激活秘钥)
    TopazGigapixelAI是一款功能强大的图像无损放大工具,具有以下功能特色:首先,它利用人工智能技术,能自动识别并增强图像中的细节,包括纹理、边缘等,同时减少噪声,使图像更加清晰细腻。其次,软件支持超高放大倍率,最高可达600%,且放大后的图像质量依然保持优秀。此外,TopazGigapixelAI还提......
  • 2024牛客暑假多校第三场 - A. Bridging the Gap 2
    思路全在注释里了:#include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintN=5e5+5;intn,l,r,a[N];boolSolve(){ //打工次数:一个人能将其他人运过去的次数=一个人能过去以后能往返的次数 scanf("%d%d%d",&n,&l,&r); intmin_go=c......
  • [论文阅读报告] All pairs shortest paths using bridging sets and rectangular matr
    本篇文章介绍整数边权下\((\min,+)\)矩阵乘、APSP等问题的一些做法。若每个元素的权值在\([-M,M]\cap\mathbbZ\)中,\(n\timesn^r\)和\(n^r\timesn\)的\((\min,+)\)矩阵乘可做到\(\tildeO(Mn^{\omega(r)})\);有向图APSP可做到\(\tildeO(n^{2+\mu(t)})\),......
  • 题解:P6902 [ICPC2014 WF] Surveillance
    可以在cnblog中阅读。考虑弱化版链怎么做,每次选取左端点在当前位置前面的线段,跳到其中最大的右端点,可以维护一个数组表示起点为\(i\)的目标位置,可以做到\(O(n+k)\)。考虑多次询问一段区间\([l,r]\)的答案,这时如果暴力从\(l-1\)开始跳是\(O(n^2)\)的,只需要一个倍增数......
  • WFUZZ模糊测试
    WFUZZ模糊测试使用指南选项:-h/--help:这个帮助--help:高级帮助--filter-help:过滤语言规范--version:Wfuzz版本详细信息-e<type>:可用编码器/有效负载/迭代器/打印机/......
  • lowflow-design:低代码流程设计器,让流程搭建更简单!
    嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法简介lowflow-design是一个基于Vue3、Vite、TypeScript、Element-Plus等技术栈开发的,适用于低代码或无代码开发平台的流程设计器。它让普通人也能通过简单配置快速搭建流程,并提供了将j......
  • springboot 工程中 SpringApplication.run方法 可以指定加载"applicationContext.xml"
    在SpringBoot应用程序中,SpringApplication.run()方法默认使用自动配置和基于Java的配置(如使用@Configuration注解的类),而不是传统的XML配置文件(如applicationContext.xml)。SpringBoot的设计理念之一就是简化配置,鼓励使用注解和Java配置来代替XML配置。然而,如果你......
  • Apache Cordova和PhoneGap
    ApacheCordova和PhoneGap是两个在移动应用开发领域备受关注的开源框架,它们有着紧密的联系和显著的区别。本文将从起源与发展、技术特点、功能与应用、社区与文档资源、性能与限制以及未来发展趋势等多个方面,对ApacheCordova和PhoneGap进行详细探讨。一、起源与发展Apach......
  • [CSS] flexbox 布局中,让其元素均匀排列且如何均匀元素之间的 column-gao 和 row-gap
    要达到上图效果,可以通过margin,但是每一行首元素和尾元素都要单独处理,通过nth-child选择器设置。也可以让每一个元素宽度都是父元素宽度的25%,然后子元素宽度再一点点调试向下减一点点,比如22%合适,并且需要设置justify-content:space-between或者其他,但如果最后一行元素不......