尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

题解:P2157 [SDOI2009] 学校食堂

题解:P2157 [SDOI2009] 学校食堂
📅 发布时间:2026/6/19 14:05:46

题目传送门

题目大意

有 \(n\) 个学生,每个学生有一个时间 \(t_i\),所花费的真实时间为 \(t_i\) 异或上前一个吃饭的同学的 \(t_i\)。每个学生有一个忍耐度,最多可以让后面 \(b_i\) 个同学比自己先吃饭。问在不违反忍耐度的条件下,让所有同学吃饭的最小时间。

解题思路

首先,我们发现 \(b_i\) 很小,考虑状压。状态设置比较离奇,\(dp_{i,j,k}\) 表示到第 \(i\) 个同学,后面7个同学,包括自己的吃饭的状态,\(0\) 是还没吃饭,\(1\) 是吃饭了,\(k\) 表示上一个吃饭的人距离 \(i\) 的距离,所以 \(-8\le k\le 7\)。

现在我们考虑转移,首先如果枚举到的 \(j\) 中,\(j\) 的第一位为 \(1\) ,也就是 \(i\) 已经吃过饭了,那就直接向后转移即可,转移式如下:

\[dp_{i+1,\frac{j}{2},k-1}=dp_{i,j,k} \]

这个转移式比较好理解,\(i+1\) 就是下一个同学,\(\frac{j}{2}\) 就是把 \(i\) 的吃饭状态去掉,而前一个吃完饭的人距离 \(i+1\) 的距离就是 \(k-1\)。

如果 \(j\) 的第一位为 \(0\) ,也就是 \(i\) 还没吃饭,那么就要枚举上一个吃饭的人,再进行转移,枚举的过程中要注意,因为每个人的忍耐度不一定相同,所以要判断一下是否满足前面所有人的忍耐度,转移式如下(\(l\) 就是 \(i\) 后面枚举到第几个人):

\[dp_{i+1,j|(1<<l),l+8}=\min (dp_{i+1,j|(1<<l),l+8},dp_{i,j,k}+t_{i+k-8} \oplus t_{i+l}) \]

转移式借助代码会好理解很多,其中的 \(+8\) 和 \(-8\) 是因为我的 \(k\) 是从 \(0\) 枚举到 \(15\) 的,所以要调整得到真实值。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010;
ll t[N],b[N],dp[N][258][20],ans;
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);ll T;cin>>T;while(T--){ll n,m;cin>>n;for(int i=1;i<=n;i++)cin>>t[i]>>b[i];memset(dp,0x3f,sizeof(dp));dp[1][0][7]=0;for(int i=1;i<=n;i++){for(int j=0;j<(1<<8);j++){for(int k=0;k<=15;k++){if(k+i-8>n)break;if(k+i-8<0||dp[i][j][k]>1e9)continue;if(j&1){dp[i+1][j>>1][k-1]=min(dp[i+1][j>>1][k-1],dp[i][j][k]);}else{ll lst=1e18;for(int l=0;l<=7&&l+i<=n;l++){if(l>lst)break;if(j&(1<<l))continue;lst=min(lst,b[i+l]+l);dp[i][j|(1<<l)][l+8]=min(dp[i][j|(1<<l)][l+8],dp[i][j][k]+(i+k-8>0)*(t[l+i]^t[i+k-8]));}}}}}ans=1e18;for(int i=0;i<=8;i++)ans=min(ans,dp[n][1][i]);cout<<ans<<"\n";}return 0;
}

相关新闻

  • vue3 与 element-plus
  • 第二周作业
  • 代码随想录算法训练营第一天| 704.二分查找、27.移除元素、977.有序数组的平方

最新新闻

  • CANN/ge获取HCCL跟随流数量
  • RxJavaSample高级技巧:10个实用方法解决回调地狱和复杂异步问题
  • 终极指南:快速解决跨平台中文显示不一致的PingFangSC字体配置方案
  • MiniCPM-V 4.6端侧部署实战:RTX 4070上稳定运行多模态推理
  • M3U8视频下载器:5分钟掌握跨平台高效下载工具
  • 如何用图像识别技术实现《鸣潮》的智能自动化体验

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号