[BZOJ1659][Usaco2006 Mar]Lights Out 关灯
[BZOJ1659][Usaco2006 Mar]Lights Out 关灯
试题描述
奶牛们喜欢在黑暗中睡觉。每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的少。他们知道按钮开关的位置,但喜闻乐见的是他们并没有手指。你得到了一个长度为T(1<=T<=7)的插槽用以帮助奶牛们改变灯的状态。
输入
第一行,两个整数L和T。第二行给出一个长度为L的01串表示初始灯的状态,0表示灯是灭的,1表示灯是亮的。第三行给出一个长度为T的01串,表示你获得的插槽。
输出
输入示例
输出示例
数据规模及约定
见“试题描述”
题解
暴力大 dp,设 f(i, S) 表示考虑是否在第 i 个位置使用插槽,分为两个转移。根据当前的 S 推第 i-1 个位置的状态,更新当前的答案。
再记一下方案,使其步数最小且字典序最大。
然后使劲写就行了,范围小随便写。
下面是代码,估计没人想看。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 55
#define maxm 10
#define maxst 130
#define oo 147483647
#define LL long long
int n, m, Lig[maxn], Swi[maxm], f[maxn][maxst], g[maxn][maxst][maxn], cg[maxn][maxst]; int bin[maxm], cb;
void Bin(int s) {
cb = 0;
while(s) {
bin[++cb] = (s & 1);
s >>= 1;
}
for(int i = cb; i; i--) printf("%d", bin[i]);
if(!cb) putchar('0');
return ;
} int _s, _l;
LL ls[maxn];
int lit(int a, int b) { return ls[b] - (ls[a-1] << b-a+1); }
int cntl(int t, int n) {
int ans = 0;
for(int i = 1; i <= n; i++) {
if(!(t & 1)) ans++;
t >>= 1;
}
return ans;
}
bool larger(int i, int j, int a, int b) {
if(cg[i][j] != cg[a][b]) return cg[i][j] < cg[a][b];
int c = cg[i][j];
for(int k = 1; k <= c; k++) if(g[i][j][k] != g[a][b][k]) return g[i][j][k] > g[a][b][k];
return 0;
} int main() {
read(); read();
char tc = Getchar();
while(!isdigit(tc)) tc = Getchar();
while(isdigit(tc)) {
Lig[++n] = tc - '0';
tc = Getchar();
}
while(!isdigit(tc)) tc = Getchar();
int cnt = 0, _c = 0;
while(isdigit(tc)) {
Swi[++m] = tc - '0';
_s = _s << 1 | Swi[m];
_l = _l << 1 | Lig[m];
cnt += (Lig[m] ^ 1);
_c += (Lig[m] ^ Swi[m] ^ 1);
tc = Getchar();
} int all = (1 << m) - 1;
for(int S = 0; S <= all; S++) f[1][S] = -oo;
f[1][_l] = cnt;
f[1][_l^_s] = _c; cg[1][_l^_s] = 1; g[1][_l^_s][1] = 1;
for(int i = 1; i <= n; i++) ls[i] = ls[i-1] << 1 | Lig[i];
for(int i = 2; i <= n - m + 1; i++)
for(int S = 0; S <= all; S++) {
f[i][S] = -oo;
for(int t = 0; t <= 1; t++) {
int SS = (t << m-1) | (S >> 1);
// printf("%d ", i-1); Bin(SS); putchar(' '); printf("%d\t", f[i-1][SS]);
if((S & 1) == Lig[i+m-1]) {
int tmp = f[i-1][SS] + (Lig[i+m-1] ^ 1);
if(tmp > f[i][S]) {
f[i][S] = tmp;
cg[i][S] = cg[i-1][SS];
for(int k = 1; k <= cg[i][S]; k++) g[i][S][k] = g[i-1][SS][k];
}
else if(tmp == f[i][S] && larger(i-1, SS, i, S)) {
cg[i][S] = cg[i-1][SS];
for(int k = 1; k <= cg[i][S]; k++) g[i][S][k] = g[i-1][SS][k];
}
}
SS = (t << m-1) | ((S ^ _s) >> 1);
// printf("%d ", i-1); Bin(SS); putchar(' '); printf("%d\t", f[i-1][SS]);
if((S & 1) == (Lig[i+m-1] ^ Swi[m])) {
int tmp = f[i-1][SS] - cntl((S ^ _s) >> 1, m-1) + cntl(S, m);
if(tmp > f[i][S]) {
f[i][S] = tmp;
cg[i][S] = cg[i-1][SS];
for(int k = 1; k <= cg[i][S]; k++) g[i][S][k] = g[i-1][SS][k];
g[i][S][++cg[i][S]] = i;
}
else if(tmp == f[i][S]) {
g[i-1][SS][++cg[i-1][SS]] = i;
if(larger(i-1, SS, i, S)) {
cg[i][S] = cg[i-1][SS]; cg[i-1][SS]--;
for(int k = 1; k <= cg[i][S]; k++) g[i][S][k] = g[i-1][SS][k];
}
}
}
// printf("%d ", i); Bin(S); putchar(' '); printf("%d\n", f[i][S]);
}
} for(int S = 0; S <= all; S++) {
if(f[maxn-1][maxst-1] < f[n-m+1][S]) {
f[maxn-1][maxst-1] = f[n-m+1][S];
cg[maxn-1][maxst-1] = cg[n-m+1][S];
for(int k = 1; k <= cg[maxn-1][maxst-1]; k++) g[maxn-1][maxst-1][k] = g[n-m+1][S][k];
}
else if(f[maxn-1][maxst-1] == f[n-m+1][S] && larger(n-m+1, S, maxn-1, maxst-1)) {
cg[maxn-1][maxst-1] = cg[n-m+1][S];
for(int k = 1; k <= cg[maxn-1][maxst-1]; k++) g[maxn-1][maxst-1][k] = g[n-m+1][S][k];
}
}
// printf("%d\n", f[maxn-1][maxst-1]);
printf("%d\n", cg[maxn-1][maxst-1]);
for(int i = 1; i <= cg[maxn-1][maxst-1]; i++) printf("%d\n", g[maxn-1][maxst-1][i]); return 0;
}
[BZOJ1659][Usaco2006 Mar]Lights Out 关灯的更多相关文章
- bzoj:1659: [Usaco2006 Mar]Lights Out 关灯
Description 奶牛们喜欢在黑暗中睡觉.每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的少.他们知道按钮开关的位置,但喜闻乐见的是他们并没有手指.你得到 ...
- Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 631 Solved: 445[Submi ...
- BZOJ1657: [Usaco2006 Mar]Mooo 奶牛的歌声
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 489 Solved: 338[Submi ...
- 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 526 Solved: 365[Submi ...
- bzoj1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 树形dp
题目链接 bzoj1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 题解 dp[i][j][0 / 1] 以i为根的子数中 相邻点对选了j个的最大价值 代码 #i ...
- 1722: [Usaco2006 Mar] Milk Team Select 产奶比赛
1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 https://www.lydsy.com/JudgeOnline/problem.php?id=1722 分析 ...
- [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈裸题)
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 961 Solved: 679[Submi ...
- 【USACO2006 Mar】滑雪缆车 skilift
[USACO2006 Mar] 滑雪缆车 skilift Time Limit 1000 msMemory Limit 131072 KBytes Description 科罗拉多州的罗恩打算为奶牛建 ...
- 小游戏 Lights Out (关灯) 的求解 —— 异或方程组
Author : Evensgn Blog Link : http://www.cnblogs.com/JoeFan/ Article Link : http://www.cnblogs.com/J ...
随机推荐
- Unity3D独立游戏开发日记(二):摆放建筑物
在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...
- [C#基础]ref和out的区别
在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN: ref 关键字使参数按 ...
- 项目笔记---Socket Error Code翻译
前言 在项目中为了方便调试及客户反馈,需要Socket错误数字的中文解释,MSDN上只有英文版,同时也想自己学习而且方便将来更新ErrorCode的实际发生的情景,顾有此博文. MSDN:https: ...
- 无法加载协定为“ServiceReference1.xxxxx”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分
原因是config节点中有多个endpoint相同节点,提示按名称指示首选的终结点,说明程序不知道选那个节点. 解决办法,实例化service服务对象时,通过name值指定创建它. config文件部 ...
- Servlet学习 (HttpServletRequest HttpServletResponse)
1.什么事servlet? 答:服务器端程序, 自定义的服务类型.tomcat是一个容器,这个容器提供各种菜的服务, 我们需要为里面放菜! web服务器就是我们的开发环境和开发基础. 实现了servl ...
- Session解析
1.除非关闭所有页面 或者超时session才销毁 2.在几个页面之间切换的时候 session保存用户状态. 3.遍历数组时候for循环中从0开始小于长度,不等于长度,用Matlab用习惯了,竟然从 ...
- 一个项目中哪些文件是要上传到 git上的,哪些是不必要的
- codevs1500 后缀排序
题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...
- Android视频直播解决方案(rstp、udp)
做局域网视频直播有两种方案,通过rstp或udp协议. 1.rstp协议,网络上有个开源项目,基于Android,且这个项目也是一个服务端,里面也集成了http访问页面,可以通过http或者rstp直 ...
- HDU2888 Check Corners
Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numbers ( 1 ...