2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest D Dividing Marbles
题目大意:
给出一个$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的更多相关文章
- 2018-2019 ICPC, NEERC, Southern Subregional Contest
目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...
- Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest
2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练
2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...
- 模拟赛小结: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 ...
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest (9/12)
$$2015-2016\ ACM-ICPC,\ NEERC,\ Northern\ Subregional\ Contest$$ \(A.Alex\ Origami\ Squares\) 签到 //# ...
- ACM ICPC 2016–2017, NEERC, Northern Subregional Contest Problem J. Java2016
题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229510 时间限制:2s 空间限制:256MB 题目大意: 给定一个数字c 用 " ...
- 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)
i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...
- 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 ...
- 2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest Problem F. Format
题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229510 时间限制:1s 空间限制:512MB 题目大意: 给定一个字符串,使用%[...] ...
随机推荐
- Python Hashtable的理解
一个对象当其生命周期内的hash值不发生改变,而且可以跟其他对象进行比较时,这个对象就是Hashtable的.两者Hashtable的对象只有具有相同的hash值时才能判断为相同的对象. ...
- Error: could not open `C:\Program Files\Java\jre6\lib\i386\jvm.cfg')
前些日子装了个jdk7试了试,后来做项目需要换成jdk6,安装完jdk6,设置完环境变量后出现问题.运行java -version出现Error: could not open `C:\Program ...
- @Resource或者@Autowired作用/Spring中@Autowired注解、@Resource注解的区别
@Resource或者@Autowired作用不用写set get就能注入,当然,前提是你已经开启了注解功能. spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定 ...
- ContentObserver与DatasetObserver区别
1. ContentObserver ContentObserver主要是通过Uri来监测特定的Databases的表,如果该Databases表有变动则会通知更新cursor中的数据. 如果 ...
- 零样本学习 - (Zero shot learning,ZSL)
https://zhuanlan.zhihu.com/p/41846072 https://zhuanlan.zhihu.com/p/38418698 https://zhuanlan.zhihu.c ...
- Hadoop 集群搭建 mark
Hadoop 集群搭建 原创 2016-09-24 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 目标 在3台服务器上搭建 Hadoop2.7.3 ...
- 消息成功失败回调demo
) )); try {// ListenableFuture<ResponseEntity<String>> future = restTemplate.postForEnti ...
- 计算机系统监控 PerformanceCounter
PerformanceCounter 컴퓨터 성능 머니터링 CUP Processor 메모리 하터웨어 DB (CPU,User Connection,Batch Request,Blocking ...
- The server has either erred or is incapable of performing the requested operation. (HTTP 500)
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正. 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- poj 1636 Prison rearrangement
Prison rearrangement Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 2158 Accepted: ...