【简●解】学校食堂
【大意】#
懒癌晚期,直接丢传送门,,,
【分析】#
开始拿到这道题没有太多的思路,再看了看数据范围,??应该是状压吧,,,然后开始往状压上想。还真是呢。。。
开始推了个错误的方程导致一直,后来瞟了眼题解,才发现自己方程的状态没有表示完,,,
我们设表示前个人已经打完了饭,第个人以及后面个人打饭的状态为,最后一个打饭的人的编号为,容易知道的范围为,那么转移就比较明显了。
先考虑,即第个人打好饭时,那么就可以直接转移到。
再思考其他情况,它们只能在以内转移。
因为~已经打完饭,所以考虑枚举打的饭,如果符合情况就转移到。
又因为可以取到负数,所以就把第三维加个偏移量,就行了。
【Code】#
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
const int BASE = 8;
const int MAX = 1000 + 5;
const int INF = 0x3f3f3f3f;
inline int read(){
bool f = 0;int x = 0;char ch;
do { ch = getchar(); if (ch == '-') f = 1; } while (ch < '0' || ch > '9');
do {x = (x << 3) + (x << 1) + ch - '0'; ch = getchar(); } while (ch >= '0' && ch <= '9');
return f ? ~x + 1 : x;
}
inline int min(int a, int b) { return a < b ? a : b; }
int C, n, t[MAX], b[MAX], f[MAX][1 << 8][20], rate, ans;
int main(){
C = read();
while (C--) {
n = read();
ans = INF;
for (int i = 1;i <= n; ++i) {
t[i] = read(), b[i] = read();
}
memset(f, 0x3f, sizeof f);
f[1][0][BASE - 1] = 0;
for (int i = 1;i <= n; ++i) {
for (int j = 0;j < (1 << 8); ++j) {
for (int k = -8;k <= 7; ++k) {
if (f[i][j][k + BASE] != INF) {
if (j & 1) {
f[i + 1][j >> 1][k - 1 + BASE] = min(f[i + 1][j >> 1][k - 1 + BASE], f[i][j][k + BASE]);
}
else {
rate = INF;
for (int h = 0;h <= 7; ++h) if (!((j >> h) & 1)){
if (i + h > rate) break;
rate = min(rate, i + h + b[i + h]);
f[i][j | (1 << h)][h + BASE] = min(f[i][j | (1 << h)][h + BASE], f[i][j][k + BASE] + ((i + k) ? (t[i + k] | t[i + h]) - (t[i + k] & t[i + h]) : 0));
}
}
}
}
}
}
for (int k = 0;k <= 8; ++k) ans = min(f[n + 1][0][k], ans);
printf("%d\n", ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!