news 2026/4/23 16:19:04

P14259 兄妹(siblings)题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P14259 兄妹(siblings)题解

前置芝士

动态规划 / DP

子集划分问题 / 可行性背包

思路

首先观察这个放书的性质。结论:对于在同一个书架上的书,只需要一个人去负责。

证明也比较简单,考虑某个人去放了这一排最远的(

最大的)书,那么它一定可以顺带放路上经过的所有的书。有了这个结论,就可以推出:在第

个书架放书的用时是固定的,就是:

那么这个问题转化成了:

为最大书架编号)个数字,把他划分成两组,求两组内部元素的和的最大值的最小值。

但是由于从一个书架移动到另一个还要花费时间,所以还有额外的代价。考虑去放书的时候移动一定是按照下标递增顺序的,同理,放完书回来也不用回头,所以下标一定单调递减。设第一组的总和为

,最大下标为

,第二组的总和为

,最大下标最大为

;则代价为

。你需要求这个代价的最小值。

上述第一个问题,是一个经典的“子集划分”问题。直接跑可行性背包加上 std::bitset 优化即可。

对于第二个问题,比较复杂,我们继续观察性质:注意到,由于这两组的并集是全集,所以

一定有一个是

这样,我们可以固定

,然后枚举,从

枚举

的值。接下来考虑如何做到

。由于

表示最大下标,所以任意

的下标都不能划分至第一组。

还是可行性背包,但是有了初始代价。

第一组初始代价是在书架之间走路所花费的

,则第二组的初始代价是在书架之间走路的代价

加上下标

的所有书架放书的代价:

;第二组的总初始代价为

这个时候再去跑可行性背包,使得两部分尽量平均即可。

Code

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

inline int read(){/*快读模板 略*/};

int cost[505];

bitset<250005> used;

void solve(){

for(int i=1;i<=500;i++) cost[i]=0;

int n=read(),m=0;

for(int i=1;i<=n;i++){

int r=read(),c=read();

cost[r]=max(cost[r],c);

m=max(m,r);

}

used.reset();

used.set(0);

int cnt=0,sum=0,ans=3e15;

for(int i=1;i<=m;i++) cost[i]*=2,sum+=cost[i];

for(int i=1;i<m;i++){

cnt+=cost[i];

used|=(used<<cost[i]);//可行性背包

int a=m*2+sum-cnt,b=i*2;//a是第二组的初始代价,b是第一组的初始代价

if(cnt<a-b){

ans=min(ans,a);//无法达到两个相等,直接取较大值

}else{

ans=min((int)(b+(cnt+a-b+1)/2+(used>>((cnt+a-b+1)/2))._Find_first()),ans);//可行性背包:寻找最接近平均值的数

ans=min((int)(a+(cnt-a+b+1)/2+(used>>((cnt-a+b+1)/2))._Find_first()),ans);

}

}

cout<<ans<<endl;

}

main(){

int T=read();

while(T--) solve();

return 0;

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:30:40

基于VUE的香远堂酒店预订系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着互联网技术的飞速发展和人们出行需求的不断增加&#xff0c;酒店预订系统的便捷性和高效性变得尤为重要。本文旨在设计并实现一个基于VUE的香远堂酒店预订系统&#xff0c;以满足用户在线预订酒店的需求&#xff0c;同时提高酒店的管理效率。该系统具备用户…

作者头像 李华
网站建设 2026/4/23 8:32:04

DB-GPT vs 传统SQL:效率提升的惊人对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个效率对比工具&#xff0c;分别使用DB-GPT和传统SQL方式完成相同的数据库查询任务。工具应记录和分析两种方式的耗时、代码复杂度及查询性能&#xff0c;生成详细的对比报告…

作者头像 李华
网站建设 2026/4/23 8:32:47

21、Linux 文件编辑与脚本编写入门指南

Linux 文件编辑与脚本编写入门指南 1. HTML 文件编辑基础 在 HTML 里,大部分格式化信息都出现在尖括号(<>)内。这些标签通常是成对出现的,结束标签和开始标签名称相同,不过结束标签名称前有一个斜杠(/)。例如, <P> 用于开始一个段落, </P> 则…

作者头像 李华
网站建设 2026/4/23 8:32:13

如何安装claude code以及ccr code

如何安装claude code以及ccr code1. 安装 node1.1 node的常规安装&#xff08;适用于linux18.04&#xff0c;linux20.04等新版本&#xff09;参考官网安装顺序&#xff1a;https://nodejs.org/en/download1.2 常规安装失败&#xff0c;其他情况下node的安装&#xff08;适用于l…

作者头像 李华
网站建设 2026/4/23 8:32:05

22、Linux脚本编写与用户组管理全解析

Linux脚本编写与用户组管理全解析 1. 脚本创建与用户交互 在Linux系统中,脚本是自动化任务和简化操作的强大工具。例如,可以创建一个脚本来提示用户输入用户名,并尝试以此用户名创建一个账户。以下是示例代码: #!/bin/bash echo -n "Enter a username: " rea…

作者头像 李华