BZOJ原题链接

洛谷原题链接

注意到\(B[i]\)很小,考虑状压\(DP\)。

设\(f[i][j][k]\)表示前\(i - 1\)个人已经拿到菜,第\(i\)个人及其后面\(7\)个人是否拿到菜的状态为\(j\),上一个拿到菜的人的编号为\(i + k,-8\leqslant k \leqslant 7\)时所用的最短时间。

然后讨论状态的转移。

  • \(j \& 1\)为真

    说明第\(i\)个人已经拿到菜,可以直接转移至\(i + 1\),即$$f[i + 1][j >> 1][k - 1] = \min{ f[i + 1][j >> 1][k - 1], f[i][j][k] }$$
  • \(j \& 1\)为假

    此时不能转移至\(i + 1\),因为第\(i\)个人还没拿到菜,不满足定义。

    于是我们可以枚举\(q = 0 \to 7\),选出\(i\)后的第\(q\)个人去拿饭:$$f[i][j | (1 << h)][h] = \min{ f[i][j | (1 << h)][h], f[i][j][k] + time(i + k, i + h) }$$

    \(time(x,y)\)表示上一个拿菜的人的编号为\(x\),这次为\(y\),则需要做菜的时间。

    而在转移这种状态时,需要考虑每个人的容忍度,在循环\(q\)的过程中,维护一个最小的容忍度,若枚举到的人已经不被之前未拿菜的某人所容忍,那么就不需要考虑这个人与其之后的人了。

最后答案为:\(\min \limits ^ {-8\leqslant k \leqslant 0} \{ f[n + 1][0][k] \}\)。

因为\(k\)可以为负,所以在储存是要整体右移。

另外,题目中给出计算时间的公式\((a | b) - (a \& b)\),实际上等于\(a \land b\)。

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int N = 1010;
  5. const int M = (1 << 8) + 10;
  6. int f[N][M][20], T[N], B[N];
  7. inline int re()
  8. {
  9. int x = 0;
  10. char c = getchar();
  11. bool p = 0;
  12. for (; c < '0' || c > '9'; c = getchar())
  13. p |= c == '-';
  14. for (; c >= '0' && c <= '9'; c = getchar())
  15. x = x * 10 + c - '0';
  16. return p ? -x : x;
  17. }
  18. inline void ckminn(int &x, int y)
  19. {
  20. if (x > y)
  21. x = y;
  22. }
  23. int main()
  24. {
  25. int i, j, k, n, m = M - 10, t, q, edr, mi;
  26. t = re();
  27. while (t--)
  28. {
  29. n = re();
  30. for (i = 1; i <= n; i++)
  31. {
  32. T[i] = re();
  33. B[i] = re();
  34. }
  35. memset(f, 60, sizeof(f));
  36. f[1][0][7] = 0;
  37. for (i = 1; i <= n; i++)
  38. for (j = 0; j < m; j++)
  39. for (k = -8 ; k <= 7; k++)
  40. if (f[i][j][k + 8] < 1e8)
  41. {
  42. if (j & 1)
  43. ckminn(f[i + 1][j >> 1][k + 7], f[i][j][k + 8]);
  44. else
  45. {
  46. edr = 1e9;
  47. for (q = 0; q <= 7; q++)
  48. if (!(j & (1 << q)))
  49. {
  50. if (i + q > edr)
  51. break;
  52. ckminn(edr, i + q + B[i + q]);
  53. ckminn(f[i][j | (1 << q)][q + 8], f[i][j][k + 8] + (i + k ? T[i + k] ^ T[i + q] : 0));
  54. }
  55. }
  56. }
  57. for (mi = 1e9, i = 0; i <= 8; i++)
  58. ckminn(mi, f[n + 1][0][i]);
  59. printf("%d\n", mi);
  60. }
  61. return 0;
  62. }

BZOJ1226或洛谷2157 [SDOI2009]学校食堂的更多相关文章

  1. 洛谷 P2157 [SDOI2009]学校食堂

    题意简述 每个人有一个口味,食堂每次只能为一个人做菜 做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为a 异或 b 每个人都有一个容忍度,最多允许紧 ...

  2. 洛谷 P2051 [SDOI2009]学校食堂

    传送门- 题目分析:首先,我们先看看做菜时间的运算机制.$(A~\texttt{or}~B)-(A~\texttt{and}~B)$这个试子看起来有点复杂(因为我太菜了),仔细想想,是不是可以转化为$ ...

  3. Luogu 2157 [SDOI2009]学校食堂 - 状压dp

    Solution 比较好想的dp, 但是坑不少QAQ, 调半天 由于容忍度 $b_i$<= 7, 所以可以考虑将第$i$个人接下来的$b_i$ 个人作为一个维度记录状态. 于是我们定义数组$f[ ...

  4. 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP

    [BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...

  5. BZOJ 1226: [SDOI2009]学校食堂Dining

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 730  Solved: 446[Submit][ ...

  6. 【题解】Luogu P2157 [SDOI2009]学校食堂

    原题传送门:P2157 [SDOI2009]学校食堂 一看题目就知道是状压dp 设f[i][j][k]表示第1到i-1个人都吃完了饭,第i个人以及后面的7个人是否打饭的状态为j,当前最后打饭的人的编号 ...

  7. 【bzoj1226】【[SDOI2009]学校食堂Dining】状压dp

    (上不了p站我要死了,侵权度娘背锅) Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人 ...

  8. BZOJ1226 [SDOI2009]学校食堂Dining 【状压dp】

    题目 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示 ...

  9. 【BZOJ1226】[SDOI2009] 学校食堂

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

随机推荐

  1. /src/log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn ...

  2. 输入框状态禁止enter键提交表单

    1:页面中如果存在input输入框和submit提交按钮时,默认按enter键会提交表单,如果我现在在做查询操作,一不小心按了enter键就会有提交表单的操作,这样显然是不合理的,所以我们要禁止按en ...

  3. ABAP 自定义排序的思想(不用系统标准的SORT语句)

    不用ABAP的标准SORT语句,你能将下面这个数组按从小到大(或从大到小)的顺序重新排列,并计算其算法复杂度吗? 现在假设有一个数组:A = [10,66,52,102,-65,85,99,1,56, ...

  4. Functional and Class Components

    [Functional and Class Components] The simplest way to define a component is to write a JavaScript fu ...

  5. cdnbest补充api

    1.应用防火墙---防CC 添加|修改 请求地址: {api_dir}/firewall/anticc 请求方式: PUT 请求参数: frcquency string 触发频率 例:low(低) | ...

  6. SQLMAP自动注入(三):参数介绍

    --delay延时扫描 --scope 从burpsuit日志中过滤日志内容,通过正则表达式筛选扫描目标,19开头,尾数为1.11.121.221的目标 --level=3 会检查user-agent ...

  7. cupp字典生成器使用

    下载: clone git https://github.com/Mebus/cupp.git

  8. thymeleaf 在js中获取message信息或获取后台属性

    <script th:inline="javascript"> /*<![CDATA[*/ [[#{message1}]] [[${abc}]] /*]]> ...

  9. 关于MySQL数据库的备份方案

    这里简单总结MySQL的备份分为3种:分为冷备份,逻辑备份,热备份. 1.冷备份: 一般主要用于非核心业务,这类业务一般都是允许业务中断的,冷备份的特点就是数度快,恢复时也最为简单.通常直接复物理文件 ...

  10. Python+Selenium学习--上传文件

    场景 文件上传操作也比较常见功能之一,上传功能操作webdriver 并没有提供对应的方法,关键上传文件的思路.上传过程一般要打开一个系统的window 窗口,从窗口选择本地文件添加.所以,一般会卡在 ...