题目链接

这道题与下一章的数位\(dp\)解题思路十分一致。

把寻找答案变成按位(并且是字典序从小到大)枚举当前这一位可以填的情况。

通过\(dp\)预处理的信息告诉我们可行性,就可以把答案紧逼到一个更小的(子)问题,非常有趣。

考虑 \(dp\) 预处理的信息:

\(f[i][j][0 / 1]\) 表示 \(i\) 块木板,最左边的长度是第 \(j\) 小(排名为 \(j\) ),最左边这块是低位 / 高位的方案数。

由于木板的数量进行了变化,在加入一块新的木板后,木板的值域从 \([1, i - 1]\) 变成了 \([1, i]\),所以我们可以考虑把木板的长度变为一个相对的数量,从而进行转化。

考虑第一种转移

\(f[i][j][0] = \sum_{k = j}^{i - 1}f[i - 1][k][1]\)

可以看做是把后面 \(i - 1\) 块木板中真实长度 \(>= j\) 的再抬高一格,这样再拼一个 \(j\) 的木板就是一个合适的状态。

第二种转移也类似:

\(f[i][j][1] = \sum_{k = 1}^{j - 1} f[i - 1][k][0]\)

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 21;
typedef long long LL;
int n;
bool st[N];
LL C, f[N][N][2];
void init() {
f[1][1][0] = f[1][1][1] = 1;
for (int i = 2; i < N; i++) {
for (int j = 1; j <= i; j++) {
for (int k = j; k <= i - 1; k++) f[i][j][0] += f[i - 1][k][1];
for (int k = 1; k <= j - 1; k++) f[i][j][1] += f[i - 1][k][0];
}
}
}
int main() {
init();
int T; scanf("%d", &T);
while (T--) {
memset(st, false, sizeof st);
scanf("%d%lld", &n, &C);
int k, last;
for (int i = 1; i <= n; i++) {
if (f[n][i][1] >= C) { k = 1, st[last = i] = true; printf("%d ", i); break; }
else C -= f[n][i][1];
if (f[n][i][0] >= C) { k = 0, st[last = i] = true; printf("%d ", i); break; }
else C -= f[n][i][0];
}
for (int i = n - 1; i; i--) {
k = k ^ 1;
int d = 0;
for (int j = 1; j <= n; j++) {
if (st[j]) continue;
++d;
if ((k == 0 && j < last) || (k == 1 && j > last)) {
// 要满足 j < last
if (f[i][d][k] >= C) { st[last = j] = true; printf("%d ", j); break; }
else C -= f[i][d][k];
}
}
}
puts("");
}
return 0;
}

AcWing 309. 装饰围栏的更多相关文章

  1. Acwing:102. 最佳牛围栏(前缀和 + 二分)

    农夫约翰的农场由 NN 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最 ...

  2. AcWing 329. 围栏障碍训练场

    大型补档计划 题目链接 考虑模拟这个过程. \(f[i][0 / 1]\) 表示从第 \(i\) 个围栏的 左/右端点开始往下走,走到原点的最小花费. 转移很容易想到,就是考虑找到一个往下走第一个碰到 ...

  3. AcWing 102. 最佳牛围栏

    农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大 ...

  4. Acwing P298 围栏

    Analysis ①首先将所有粉刷匠,按照必须刷的小木块Si从小到大排序. 上面这个操作为了保证我们可以顺序处理. ②我们可以设f[i][j]表示为,前i个粉刷匠,刷了前i个木块.可以有些木块选择不刷 ...

  5. AcWing 298. 围栏 (POJ1821)

    标签(空格分隔): dp 单调队列优化 题目描述 有N块木板从左到右排成一行,有M个工匠对这些木板进行粉刷,每块木板至多被粉刷一次. 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长 ...

  6. Acwing-102-最佳牛围栏(二分,实数)

    链接: https://www.acwing.com/problem/content/104/ 题意: 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过200 ...

  7. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  8. 装饰者模式 Decoration

    1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...

  9. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

随机推荐

  1. jsp 和servlet基础知识

    1  在tomcat服务器当中,4**表示客户端请求错误,5**表示程序错误 2.request知识参考网址:http://wenku.baidu.com/link?url=wYwTGk8XKrLzA ...

  2. mysql语句的书写顺序和执行顺序

    mysql语句的书写顺序和执行顺序有很大差异. 书写顺序,mysql的一般书写顺写为: select <要返回的数据列> from <表名> <join, left jo ...

  3. Python_selenium案例:

    selenium案例 #coding=utf-8 #select下拉框处理 from selenium import webdriver from selenium.webdriver.common. ...

  4. 太湖杯writeup

    CheckInGame checkInGame本题是个js游戏 设置个断点后,之后修改时间即可,然后把游戏玩完就行. ezWeb 本题是模板注入,过滤了{}和"",用︷︸和无引号的 ...

  5. 吉他软件Guitar Pro入门

    Guitar Pro是一款优秀的吉他学习软件,初学者可以依靠其学习理论知识,也可以通过和弦添加.曲谱导出等功能来提升弹奏能力.今天,小编就给大家简略地介绍下吉他软件Guitar Pro. 乐谱编辑功能 ...

  6. FL Studio20效果器Fruity Reverb 2功能介绍

    FL Studio,也就是我梦通常所说的水果音乐制作软件,是一款新手就可以用的软件.其操作简单,界面简洁大方,就算只用鼠标也可以轻松编曲. FL Studio20中有许多自带合成器是很好用的,同时也是 ...

  7. C语言讲义——字符串

    字符数组 C语言字符串就是字符数组. 单写字符,用单引号.如:'A'. 字符串用双引号.如:"A"."ABC". #include <stdio.h> ...

  8. Kafka源码环境搭建

    github地址:https://github.com/apache/kafka clone下来之后可以看到这样的项目结构: 文件目录说明. 目录 描述 bin Windows 和 Linux 下 K ...

  9. Kubernetes-20:日志聚合分析系统—Loki的搭建与使用

    日志聚合分析系统--Loki 什么是Loki? Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统.它的设计非常经济高效且易于操作,因为它不会 ...

  10. CentOS SSH安全和配置无密码登录

    CentOS ssh默认监听端口 22端口,允许root用户ssh登录.server投入生产后很有必要更改默认ssh监听端口和禁止root登录. 步骤1:确认安装有ssh包 [appuser@su17 ...