news 2026/5/27 5:56:31

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/5/26 21:01:11

智能简历解析终极指南:如何用AI技术精准提取关键信息

智能简历解析终极指南&#xff1a;如何用AI技术精准提取关键信息 【免费下载链接】Resume-Matcher Resume Matcher is an open source, free tool to improve your resume. It works by using language models to compare and rank resumes with job descriptions. 项目地址…

作者头像 李华
网站建设 2026/5/25 16:35:56

springAI学习 一

一、Spring AI 概述 什么是Spring AI&#xff1f; Spring生态的AI集成框架 统一API访问不同AI服务&#xff08;OpenAI、Azure OpenAI、Anthropic等&#xff09; 支持多种AI功能&#xff1a;聊天、文生图、嵌入、向量存储等 Spring AI 是一个用于 AI 工程的应用框架。 其目标…

作者头像 李华
网站建设 2026/5/26 15:35:04

串口助手唐老鸭版:解决你串口调试痛点的终极方案

串口助手唐老鸭版&#xff1a;解决你串口调试痛点的终极方案 【免费下载链接】串口助手唐老鸭版使用说明 串口助手(唐老鸭版)是一款功能强大且易于使用的串口调试工具&#xff0c;专为开发者设计。其界面友好&#xff0c;操作简单&#xff0c;能够满足各种串口调试需求。无论是…

作者头像 李华
网站建设 2026/5/26 7:04:33

30秒创建一个智能解压工具:快马平台体验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个简单的图形界面解压工具原型&#xff0c;功能包括&#xff1a;1)文件选择对话框 2)解压目标路径选择 3)显示压缩包内容预览 4)进度条显示 5)解压完成通知。使用Pythontkint…

作者头像 李华
网站建设 2026/5/27 5:44:15

每日一题Day08-数组的第K大元素

题面首先看我第一眼看到这道题的解法代码class Solution {public int findKthLargest(int[] nums, int k) {int n nums.length;Arrays.sort(nums);return nums[n - k];} }这样解好像也可以&#xff0c;但好像又在耍流氓&#xff0c;所以我就去看题解了最后看到一道一下用自己的…

作者头像 李华
网站建设 2026/5/26 7:33:23

基于VUE的网上预约挂号系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着医疗信息化的发展&#xff0c;网上预约挂号系统在优化医疗服务流程、提高患者就医体验方面发挥着重要作用。本文设计并实现了一个基于VUE的网上预约挂号系统&#xff0c;该系统具备系统用户管理、新闻数据管理、系统简介设置、变幻图设置、用户管理、医生管…

作者头像 李华