Description

小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭。学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴。当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示。由于人手不够,食堂每次只能为一个人做菜。做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的。其中,or 和and 表示整数逐位或运算及逐位与运算,C语言中对应的运算符为“|”和“&”。学生数目相对于这个学校还是比较多的,吃饭做菜往往就会花去不少时间。因此,学校食堂偶尔会不按照大家的排队顺序做菜,以缩短总的进餐时间。虽然同学们能够理解学校食堂的这种做法,不过每个同学还是有一定容忍度的。也就是说,队伍中的第i 个同学,最多允许紧跟他身后的Bi 个人先拿到饭菜。一旦在此之后的任意同学比当前同学先拿到饭,当前同学将会十分愤怒。因此,食堂做菜还得照顾到同学们的情绪。现在,小F 想知道在满足所有人的容忍度这一前提下,自己的学校食堂做完这些菜最少需要多少时间。

Input

第一行包含一个正整数C,表示测试点的数据组数。每组数据的第一行包含一个正整数N,表示同学数。每组数据的第二行起共N行,每行包含两个用空格分隔的非负整数Ti和Bi,表示按队伍顺序从前往后的每个同学所需的菜的口味和这个同学的忍受度。每组数据之间没有多余空行。

Output

包含C行,每行一个整数,表示对应数据中食堂完成所有菜所需的最少时间。

题解:

题意还是很好理解的,首先(a or b)-(a and b)就是a^b啊。

状压dp,令f[i][j][k]表示前i-1个人已经全部点完餐,当前第i个人以及之后的7人的点餐状态为j,上一个点餐的人与i的坐标差为k-8,(因为上一个人可能是-8到7)。

然后就有很显然的方程了。

如果第i个人已经点餐,则状态可转移成f[i+1][j>>1][k-1]

否则考虑下一点餐的是谁,从i到i+7全部for一遍,如果超过容忍度的话,就break掉。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 1005
#define inf 2139062143
int T,t[MN],b[MN],n;
int f[MN][300][18];
void rw(int &x,int y){if(y<x)x=y;}
int main(){T=read();register int i,j,k,h,lir;while(T--){n=read();for(i=1;i<=n;i++) t[i]=read(),b[i]=read();memset(f,0x7f,sizeof f);f[1][0][7]=0;for(i=1;i<=n;i++)for(j=0;j<(1<<8);j++)for(k=-8;k<=7;k++)if(f[i][j][k+8]!=inf){if(j&1&&k+8) rw(f[i+1][j>>1][k+7],f[i][j][k+8]);else{lir=inf;for(h=0;h<=7;h++)if(!((j>>h)&1)){if(i+h>lir) break;rw(lir,i+h+b[i+h]);rw(f[i][j|(1<<h)][h+8],f[i][j][k+8]+(i+k?(t[i+k]^t[i+h]):0));}}}int ans=inf;for(int i=0;i<=8;i++) rw(ans,f[n+1][0][i]);printf("%d\n",ans);}return 0;
}


来自PaperCloud的博客,未经允许,请勿转载,TKS

转载于:https://www.cnblogs.com/PaperCloud/p/9036073.html

[SDOI2009][BZOJ 1226]学校食堂相关推荐

  1. bzoj 1226 学校食堂

    时间限制:1秒 内存限制:64M [问题描述] 小F的学校在城市的一个偏僻的角落,所有学生只好在学校食堂吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学满意的菜肴.当然,不同的人的口味也不一定 ...

  2. BZOJ 1226 [SDOI2009] 学校食堂Dining

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

  3. 【BZOJ1226/SDOI2009】学校食堂Dining

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec  Memory Limit: 259 MB                                 ...

  4. P2157 [SDOI2009]学校食堂

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

  5. [SDOI2009]学校食堂

    前言:经过AC这道题的过程,让我明白了一点,不要过于相信您的同伴(因为他会让您的代码wa一天还不清楚为什么).---上述观点均由StarTrek大佬背锅 题目描述 原题链接:[SDOI2009]学校食 ...

  6. [SDOI2009]学校食堂(状态压缩)

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

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

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

  8. BZOJ1226【SDOI2009】学校食堂

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

  9. [SDOI2009]学校食堂Dining

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

最新文章

  1. CODING 2.0 企业级持续交付解决方案
  2. SQL Server 2008 R2 系统配置检查器的检查参数和妨碍性问题的解决办法
  3. vim一些挺方便的功能
  4. div alert html,基于jQuery的弹出消息插件 DivAlert之旅(一)
  5. python标准库os的方法listdir_使用python标准库快速修改文件名字
  6. Kafka 批量消费消息
  7. 2021年泸州市高考三诊成绩查询,2020-2021学年四川省泸州市高考数学三诊试卷(理科)及答案解析...
  8. Java包装器类及自动装箱(自动打包)
  9. Hexo搭建自己的专属博客,连接github数据仓库
  10. Chrome网页设置眼睛保护色
  11. VS创建和使用C++动态链接库教程
  12. Leetcode腾讯50题精选题解|旋转图像
  13. @vaild校验参数
  14. 用严密的数学语言证明:周长相同时,圆面积最大
  15. python读取批量txt文件
  16. cesium 指南针、比例尺
  17. espn配置路由_华为敏捷网络解决方案.ppt
  18. 年轻人如何创业(如何创业白手起家)
  19. 安卓开发 智能农业 详细
  20. 软件测试经典面试题总结文库,软件测试经典面试题总结

热门文章

  1. python socks代理_如何让任意python程序使用socks代理
  2. 一个假程序员的心里话---有良知
  3. Android X86 解决ARM兼容的问题
  4. 筒仓计算表格_筒仓世界中的开源极客
  5. *W3C* 标准组织
  6. 云崽部署问题解决贴:关于Yunzai-Bot部署后可能遇到的QQ版本过低问题||和一个puppeteer Chromium启动失效问题
  7. 淘宝API商品详情接口,通过商品ID获取商品名称,淘宝主图,价格,颜色规格尺寸,库存,SKU等
  8. 淘宝API 淘宝链接获取解析获取商品id
  9. 大数据学习之路-Hadoop
  10. 旧作 一剪梅•秋夜