不知道有没有人跟我有一样的感觉……实际上很多的状压DP都不难,然而调到心碎……这题题面看起来很长,还有混合的‘位运算’来吓唬人(实际上就是异或而已)。但实际上只要仔细阅读,发现也是一道水水的裸题。

  首先,题目当中给出的信息是:\(B_{i} <= 7\)。看到这一条,心中已有八分笃定:在这样的环境下,估计是状压。然后就开始考虑转移的方程: 先从暴力的状态开始,我们要确定没有后效性的状态,则有两个维度应该是必须的。一维代表 \(i\),即现在 \(1 -> i\) 之间的同学都已经打到饭了,以及 \(j\) 即上一名打饭的同学的口味值。最后的一维状压,压 \(\left (i + 1, i + 8  \right )\) 号同学的打饭状态,后面的就不用了,因为第 \(i + 1\) 个人目前还没有打到饭,他最大只能容忍第 \(i + 8\) 名同学先打。

  可是出现了一个问题:\(j\)的范围过大。所以不能存值,只能存编号。考虑在第\(i + 1\) 个人还没有打饭的情况下,上一个打饭的人只能在范围 \(\left (i - 7, i + 8  \right )\) 中,我们存下这一个编号,并且规定一个标准:第 \(i\) 名同学的编号为 \(7\)。这样,所有可能的同学编号均在 \(\left (0, 15 \right )\) 的范围内。

  感觉我的状压dp代码有毒……食用需谨慎呐 ̄へ ̄

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
#define INF 9999999
int T, CNST;
int n, a[maxn], t[maxn];
int f[maxn][][]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Init()
{
for(int i = ; i <= n; i ++)
for(int j = ; j <= ; j ++)
for(int k = ; k < CNST; k ++)
f[i][j][k] = INF;
} void update(int &x, int y) { x = x < y ? x : y; } int main()
{
T = read(), CNST = ( << ) - ;
while(T --)
{
n = read();
Init();
for(int i = ; i <= n; i ++) a[i] = read(), t[i] = read();
f[][][] = ;
for(int i = ; i < n; i ++)
for(int k = ; k < CNST; k ++)
{
for(int j = ; j <= ; j ++)
{
if(f[i][j][k] >= INF) continue;
int tmp = k, minn = INF;
for(int s = ; s <= && (i + s + ) <= n; s ++)
if(!((tmp >> s) & )) minn = min(minn, s + t[i + s + ]);
if(minn == INF || k & ) minn = ;
for(int s = ; s <= minn; s ++)
{
if((k >> s) & ) continue;
if(i + s + > n) break;
int q = i + j - >= ? a[i + j - ] : ;
if(!i && !k) q = a[i + s + ];
int ret = q ^ a[i + s + ];
if(s + <= ) update(f[i][s + ][k | ( << s)], f[i][j][k] + ret);
}
int q = (i + j - ) >= ? a[i + j - ] : ;
if(!i && !k) q = a[i + ];
update(f[i + ][][k >> ], f[i][j][k] + (q ^ a[i + ]));
if(j && (k & )) update(f[i + ][j - ][k >> ], f[i][j][k]);
}
}
int ans = INF;
for(int j = ; j <= ; j ++)
for(int k = ; k < CNST; k ++)
ans = min(ans, f[n][j][k]);
printf("%d\n", ans);
}
return ;
}

【题解】SDOI2009学校食堂的更多相关文章

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

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

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

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

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

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

  4. P2157 [SDOI2009]学校食堂Dining

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

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

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

  6. luogu2157 [SDOI2009]学校食堂 局部状压

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

  7. [LuoguP2157][SDOI2009]学校食堂_状压dp

    学校食堂 题目链接:https://www.luogu.org/problem/P2157 数据范围:略. 题解: 发现$B$特别小,很容易想到状压. 即在$dp$的时候弄出来$f_{(i,j,k)} ...

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

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

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

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

  10. [SDOI2009]学校食堂Dining

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

随机推荐

  1. 浅谈localStorage的用法

    今天接到一个任务,说是让自动调节textarea标记的输入高度,而且还要记录下来,下次登录的时候还是调节后的高度,我第一时间就想到了localStorage的用法,直接代码献上: <html l ...

  2. django环境搭建和学习

    由于服务器down了好几天,前几天做的django的project全都在上面,无法继续开展工作,所以决定在本地重新部署一套virtualenv 之前没有好好整理过部署过程(其实也不难),所以决定写个随 ...

  3. PHP解决跨域问题

    在做项目的过程中经常需要跨域访问.这里主要介绍一下 PHP 中怎么解决跨域问题. 1.允许所有域名访问 header('Access-Control-Allow-Origin: *'); 2.允许单个 ...

  4. C# 用HttpWebRequest模拟一个虚假的IP伪造ip

    有人会说:IP验证是在TCP层完成的,不是HTTP层完成的,如果伪造IP的话可能连TCP的三次握手都完不成.我这里说的不是完全意义的伪造.如果你使用透明代理上网,那么在透明代理发送给服务器端的HTTP ...

  5. zabbix使用iostat命令参数监控磁盘性能

    iostat命令 先说一个坑把,在开始监控的时候使用命令iostat -dtkx,得到的结果看上去没问题,但是在web监控窗口数据就说不变动,为啥呢,因为iostat这个命令得到的第一个数据始终是磁盘 ...

  6. python学习——函数

     一.在python的世界里什么是函数: 答:函数通常是用来实现某一个功能二被封装成的一个对象,是用来实现代码复用的常用方式 现在有一个需求,假如你在不知道len()方法的情况下,要你计算字符串‘he ...

  7. sorted() ,filter() ,map()的用法

    sorted() 排序函数. 语法: sorted(Iterable, key=None, reverse=False) Iterable: 可迭代对象 key: 排序规则(排序函数), 在sorte ...

  8. BAT批处理

    常用命令 查看目录内容命令dir 指定可执行文件搜索目录path 创建目录命令md 打开指定目录命令cd 删除当前指定的子目录命令rd 改变当前盘符命令d: 文件复制命令copy 显示文本文件内容命令 ...

  9. LINQ查询操作符

    ·First - 返回集合中的第一个元素:不延迟 ·FirstOrDefault - 返回集合中的第一个元素(如果没有则返回默认值):不延迟 ·Last - 返回集合中的最后一个元素:不延迟 ·Las ...

  10. CC3100BoosterPack和CC31XXEMUBOOST板子的测试

    1. 先测试右边的CC3100BoosterPack,测试发现LDO坏了,无法输出3.3V,所以只能用左边的板子供电. 2. 插上CC31XXEMUBOOST板子的J1,两个板子插在一起,等待驱动安装 ...