传送门

题目分析:
首先,我们先看看做菜时间的运算机制。
$(A~\texttt{or}~B)-(A~\texttt{and}~B)$这个试子看起来有点复杂(因为我太菜了),仔细想想,是不是可以转化为$A~\texttt{xor}~B$呢?
好了,我们已经知道了运算机制,并将其化简了,接下来再看看其他的东东。

我太菜了,所以只能简单地理解为:
给定$n$个人, 确定一个排列, 使得不存在$i+b_{i}$在$i$之前。
并最小化下面这个式子。
$\sum_{i=2}^{n}t_{i}$ $\texttt{xor}$ $t_{i-1}$应该都看得懂吧。
然后我们再看看数据范围。
$1<=bi<=7$。所以我们可以考虑状压DP 其实我是点开了标签才知道是状压的 。

往最简单的想:
$f[i][j]$表示前$i-1$个人已经打了饭,第$i$个人打饭,包括ta自己的后面的人打饭的集合。如,0101中0就是没打,1就是打。
但是显然题目里面允许$b_{i}$个同学插队,所以我们要记录一下前面打饭的人。

所以最终状态定义为:
$f[i][j][k]$表示前$i−1$个人都已经打完饭,$ i∼i+7$的打饭集合为$j$, 上一个打饭的是$i+k$.
为了方便理解,我的代码里面for循环是$k=-8~7$,所以宏定义了一下,把$k$加了一个10。
其实这个10可以随意,只要大于8就可以了,因为c++数组不能为负数。
这样处理,可以方便理解,减少打代码时的错误,而且数组相对位置没变,对答案没有影响。
扯了那么多,接下来就是递推了。

因为是求最小值,所以最开始$f$数组赋为$inf$,边界$f[1][0][-1]=0$。
然后枚举$2^8$种情况,即256,在这些0101001序列中:
当$j&1!=0$时,说明ta已经打了饭,后面的人就不会跑到他前面。
我们发现这个状态和 $f[i+1][j>>1][k−1]$ (第$i+1$个人打饭, 集合为去掉$i$后的状态, 最后一个打饭的人是$(i+1)+(k−1)$是一样的.可以直接转移过去.
当$j&1==0$时,说明ta还没有打饭,那么此时我们就在后面的$b_{i}$人里面枚举,去一个最小值。
还要注意的是,第一道菜没有代价,所以特判一下。
其次,为了满足同学的容忍度,如果同学忍无可忍了,就$break$出循环。

代码:

#include <bits/stdc++.h>
#define f(i,j,k) f[i][j][k+10]
using namespace std; const int N=;
int n,t[N],b[N],f[N][][]; int main()
{
ios::sync_with_stdio();
int T;
cin>>T;
while (T--) {
cin>>n;
for (int i=;i<=n;i++)
cin>>t[i]>>b[i];
memset(f,0x3f,sizeof(f));
f(,,-)=;
for (int i=;i<=n;i++)
for (int j=;j<;j++)
for (int k=-;k<;k++)
if (f(i,j,k)<1e9) {
if (j&)
f(i+,j>>,k-)=min(f(i+,j>>,k-),f(i,j,k));
else {
int r=1e9;
for (int l=;l<;l++)
if (!(j&(<<l))) {
if (i+l>r) break;
if (i+l+b[i+l]<r) r=i+l+b[i+l];
f(i,j|(<<l),l)=min(f(i,j|(<<l),l),f(i,j,k)+(i+k?(t[i+k]^t[i+l]):));
}
}
}
int ans=1e9;
for (int i=-;i<=;i++)
ans=min(ans,f(n+,,i));
cout<<ans<<endl;
}
return ;
}

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

  1. BZOJ1226或洛谷2157 [SDOI2009]学校食堂

    BZOJ原题链接 洛谷原题链接 注意到\(B[i]\)很小,考虑状压\(DP\). 设\(f[i][j][k]\)表示前\(i - 1\)个人已经拿到菜,第\(i\)个人及其后面\(7\)个人是否拿到 ...

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

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

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

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

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

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

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

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

  6. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

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

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

  8. bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)

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

  9. [SDOI2009]学校食堂Dining

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

随机推荐

  1. 使用JMeter录制手机App脚本

    Apache JMeter是100%的Java桌面应用程序,用于对软件做压力测试.它最初被设计用于Web应用测试,但后来扩展到其他测试领域.现如今这款软件越来越受到测试人员的青睐,相比于LoadRun ...

  2. Solidworks如何在装配图中保存单独的一个零件

    如下图所示,我想要保存装配体的一个单独的零部件   选中该零件后点击编辑零部件   然后点击顶部的文件-另存为,弹出"解决模糊情形"对话框,询问你要保存装配体还是零部件   点击确 ...

  3. MPTCP 理解

    背景      随着技术的发展许多设备具有了多个网络接口,而TCP依然是一个单线路的协议,在TCP的通信过程中发端和收端都 不能随意变换地址.我们可以利用多个网络接口的这一特性来改善性能和有效冗余.例 ...

  4. 关于web后门权限防删的一个新思路

    见土司有一帖子 具体看下面连接 https://www.t00ls.net/thread-26444-1-2.html 这是php的 其实IIS也有类似的 这是MSF生成的一个ASPX执行shellc ...

  5. Laravel之加密解密/日志/异常处理及自定义错误

    一.加密解密 1.加密Crypt::encrypt($request->secret) 2.解密try { $decrypted = Crypt::decrypt($encryptedValue ...

  6. 【Django】其他项目导入到Pycharm无法使用,报错:Error: Django is not importable in this environment

    导入项目后如下:项目名称那出现一个小叉 点击启动后提示错误: 那是由于运行环境的路径没有指向python的安装路径,如下图即可解决问题

  7. 在服务端发起一个Post请求

    1.http://www.tuling123.com/openapi/api?key=9d2ff29d44b54e55acadbf5643569584&info=? 上面这个请求在服务端发起 ...

  8. sprint3 【每日scrum】 TD助手站立会议第十天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 团队进入最终的功能测试阶段,准备发布Beta版 和团队发布Beta版,并开总结会议 总结会议 Y 刘静 团队集合软件测试 软件发布 没有 Y ...

  9. 手动建立storybook

    1. Add @storybook/react npm i --save-dev @storybook/react 2. Add react, react-dom, and babel-core np ...

  10. Atitit.业务系统的新特性 开发平台 新特性的来源总结

    Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. ...