题目大意:

给出一个$N(N <= 2^{22}$),$N$的二进制表示中1的个数不超过4.  一开始有一个集合$S = {N}$, 每次操作可以选择$n\in S \ (n > 1)$, 将$n$拆成两个正整数$n_1$和$n_2$,$n = n1 + n2$, 然后令$S = \{S \setminus n\} \cup \{n_1, n_2\}$.  问最少多少次操作使得$S = \{ 1 \}$.

题解:

考虑将这个过程倒过来,本质是让求一个最短的Brauer chain。考虑一个Brauer chain $a_0, a_1, \dots a_k$, 其中$a_0 = 1$, $ a_k = N$. 首先类似快速幂随便构造一下可以得到一个长度为$s+t-2$的Brauer chain,$s$ 是$N$二进制位数,$t$是二进制表示下1的个数。 比如$N = (1110)_2, s = 4, t = 3$, 可以如下构造:$\{(1)_2, (10)_2, (100)_2, (1000)_2, (1100)_2, (1110)_2\}$. 因此答案上界是$s+t-2$.

进一步挖掘一下性质:

$$s = \lfloor log_{2}{n} \rfloor + 1 , t \le 4$$

$$k \le s + t - 2 \le \lfloor log_{2}{n} \rfloor + 1 + 4 - 2 \le log_{2}{n} + 3$$

可以得到$ a_k \ge  2^{k - 3}$,根据Brauer chain的性质,必须有$a_{i - 1} >= \frac{a_i}{2}$. 从$a_k$倒着推回去可以推出任意$0 \le i \le k$, $a_i \ge 2^{i - 3}$.

爆搜所有满足这个性质且最后一项不超过$2^{22}$的Brauer chain。 发现本地大概要跑50s。

然后想到没必要让$k \le s + t - 2 $取等号,因为等号的情况可以直接构造。所以我们让爆搜的条件更加严格一点,$k < s + t - 2 $ 也就是说$ k \le s + t - 3$. 重新顺着刚才的思路推导一遍得到更强的条件$ a_i \ge  2^{i - 2}$。 然后爆搜就只要0.2s左右了。对于没有搜到的解,直接构造即可。

代码:

 #include <bits/stdc++.h>
using namespace std; #define N 100010
typedef long long LL;
const int mod = ;
const double EPS = 1e-; int a[];
vector<int> ans[( << ) + ]; void DFS(int k)
{
if (k >= && a[k] < ( << (k - ))) return;
if (k > ) return; if (__builtin_popcount(a[k]) <= && (ans[a[k]].size() == || k < ans[a[k]].size()))
{
ans[a[k]].clear();
ans[a[k]] = vector<int>(a, a + k + );
}
for (int i = ; i <= k; ++i)
{
a[k + ] = a[k] + a[i];
if (a[k + ] > ( << )) break;
DFS(k + );
}
} int main()
{
freopen("dividing.in", "r", stdin);
freopen("dividing.out", "w", stdout); a[] = ;
DFS();
for (int i = ; i <= ( << ); ++i)
{
if (__builtin_popcount(i) > || ans[i].size() > ) continue; int j;
for (j = ; ( << j) <= i; ++j)
ans[i].push_back( << j);
j--;
int now = << j;
for (int k = ; k < j; ++k)
{
if ((i >> k) & )
{
now |= << k;
ans[i].push_back(now);
}
}
} int T, d1, d2, d3, d4, n, k;
scanf("%d", &T);
while (T--)
{
scanf("%d %d %d %d", &d1, &d2, &d3, &d4);
n = ( << d1) + ( << d2) + ( << d3) + ( << d4); printf("%d\n", k = ans[n].size() - ); for (int i = k; i >= ; --i)
{
printf("%d %d %d\n", ans[n][i], ans[n][i - ], ans[n][i] - ans[n][i - ]);
}
} return ;
}

2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest D Dividing Marbles的更多相关文章

  1. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  2. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  3. 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...

  4. 模拟赛小结:2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest 2019年10月11日 15:35-20:35(Solved 8,Penalty 675 ...

  5. 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest (9/12)

    $$2015-2016\ ACM-ICPC,\ NEERC,\ Northern\ Subregional\ Contest$$ \(A.Alex\ Origami\ Squares\) 签到 //# ...

  6. ACM ICPC 2016–2017, NEERC, Northern Subregional Contest Problem J. Java2016

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229510 时间限制:2s 空间限制:256MB 题目大意: 给定一个数字c 用 " ...

  7. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  8. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  9. 2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest Problem F. Format

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229510 时间限制:1s 空间限制:512MB 题目大意: 给定一个字符串,使用%[...] ...

随机推荐

  1. 我的PHPMailer_v5.1 使用

    <?php /** * Simple example script using PHPMailer with exceptions enabled * @package phpmailer * ...

  2. C#秘密武器之特性

    一.概述 Attribute说白了就是一个类而已,里边一般含有一些附加信息,或者一些特殊的处理逻辑,以便告诉编译器应用该特性的东东是个奇葩,需要特殊对待! 二.使用时的注意事项 2.1. Attrib ...

  3. 2014小米,百度,pptv,去哪儿笔试题目回忆

    今天一共笔试了这四家,真累啊,上午10点小米,下午2点百度,下午3点PPTV,下午5点去哪儿,今天右手太酸了,打的都话了50左右,如果没面试通知,那我可亏大了 小米就三题: 1.一个数组,排序要求,所 ...

  4. h5移动端百分比

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. CSS优先级的详细解说

    一.什么是CSS优先级? 所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序. 二.CSS优先级规则 既然样式有优先级,那么就会有一个规则来约定这个优先级,而这个“规则”就是本次所需要讲的重 ...

  6. Android之Handler用法总结/安卓中只有主线程可以修改UI

    Handler传递消息的方式可以实现实时刷新以及长按连续响应事件. 按钮响应 btnadd_fcl.setOnTouchListener(new View.OnTouchListener() { pr ...

  7. 基于mybatis-generator代码生成工具改(链式方法实体版)

    概述 一直以来使用原生mybatis-generator的我发现有一个地方很不方便,即它生成的实体类的set方法返回值是void,而目前比较流行的则是链式set的写法,即set方法返回值不再是void ...

  8. angular开发中对请求数据层的封装

    代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...

  9. 巧用FTP命令进行文件传输

    巧用FTP进行文件传输   Internet作为现代信息高速公路已深入我们的生活,其中它所提供的电子邮件Web网站信息服务已被越来越多的人所熟知和使用.FTP作为Internet的功能之一,虽然没有像 ...

  10. .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

    过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...