news 2026/4/16 14:16:48

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/16 12:21:52

震惊!这家外卖小程序团队竟让企业订单暴涨300%!

震惊&#xff01;这家外卖小程序团队竟让企业订单暴涨300%&#xff01;在当今数字化浪潮中&#xff0c;外卖行业竞争日趋白热化&#xff0c;许多餐饮企业都在寻找能够真正带来业务增长的解决方案。近期&#xff0c;一家专注于外卖小程序开发的技术团队引起了业界广泛关注&#…

作者头像 李华
网站建设 2026/4/15 16:05:37

深度解析Prometheus监控系统:从零搭建企业级监控平台的完整指南

监控系统演进历程&#xff1a;从传统工具到云原生监控 【免费下载链接】prometheus-handbook Prometheus 中文文档 项目地址: https://gitcode.com/gh_mirrors/pr/prometheus-handbook 在云计算和容器化技术普及之前&#xff0c;企业监控主要依赖Nagios、Zabbix等传统工…

作者头像 李华
网站建设 2026/4/16 10:42:05

uni-app跨平台开发完整指南:从零开始构建多端应用

uni-app跨平台开发完整指南&#xff1a;从零开始构建多端应用 【免费下载链接】uni-app A cross-platform framework using Vue.js 项目地址: https://gitcode.com/dcloud/uni-app 想要一次性开发就能在微信、支付宝、抖音、H5、App等多个平台运行的应用吗&#xff1f;&…

作者头像 李华
网站建设 2026/4/16 10:45:11

基于VUE的闲置物品交易系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着共享经济理念的深入人心&#xff0c;闲置物品交易市场日益繁荣。为满足用户便捷、高效地进行闲置物品交易的需求&#xff0c;本文设计并实现了一个基于VUE的闲置物品交易系统。该系统涵盖系统用户管理、新闻数据管理、变幻图设置、留言管理、闲置物品管理、…

作者头像 李华
网站建设 2026/4/16 12:14:44

Git小白必看:轻松搞定版本识别错误的5个步骤

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个面向新手的交互式教程&#xff0c;通过对话式UI引导用户解决cannot identify version of git executable错误。包含&#xff1a;1. 卡通形象引导 2. 实时终端模拟器 3. 错误…

作者头像 李华
网站建设 2026/4/16 12:44:24

微信支付PHP开发库深度解析:构建安全高效的支付应用

微信支付PHP开发库深度解析&#xff1a;构建安全高效的支付应用 【免费下载链接】wechatpay-php 微信支付 APIv3 的官方 PHP Library&#xff0c;同时也支持 APIv2 项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-php 在当今数字化支付时代&#xff0c;如何快速…

作者头像 李华