Jamie and Binary Sequence (changed after round) CodeForces - 916B (贪心)
大意: 求将n划分为k个2的幂的和, 且最大幂最小,字典序尽量大
比较简单的贪心练习题, 但放在div2的B题感觉偏难了.....
先只考虑最大幂最小, 首先注意到直接按n的二进制划分即可得到最小划分, 所以若k小于n二进制中1的个数的话显然不存在方案
否则若k足够大的话, 要使最高幂最小, 可以把最高幂可以分解成两个低次幂, 这样会使划分数增加1
基本思想就是用贪心从最坏状态调整到最优状态, 由于每次划分数加1, 一定可以达到k划分
但是这样划分完, 可以发现得到的划分字典序一定是最小的, 为了使字典序最大, 再进一步调整
假设最大幂最$mx$, 每次选出第一个小于$mx$的数$x$, 将2个$x$转化为$x+1$ (其实这里x只能是mx-1)
为了使划分数不变, 再选出最小的数$y$, 将$y$转化为2个$y-1$即可
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll; const int N = 4e5+10;
ll n;
int k; int main() {
scanf("%lld%d", &n, &k);
map<int,int,greater<int> > s;
int sz = 0;
REP(i,0,61) if (n>>i&1) ++s[i],++sz;
if (sz>k) return puts("NO"),0;
puts("Yes");
while (sz!=k) {
auto t = s.begin();
int num = t->first;
if (!--s[num]) s.erase(t);
s[num-1] += 2;
++sz;
}
int mx = s.begin()->first;
while (s[mx-1]>=2) {
if (s[mx-1]==2&&s.upper_bound(mx-1)==s.end()) break;
if (!(s[mx-1]-=2)) s.erase(mx-1);
++s[mx];
auto t = s.end(); --t;
int num = t->first;
if (!--s[num]) s.erase(t);
s[num-1] += 2;
}
for (auto t:s) REP(i,1,t.second) printf("%d ",t.first);
puts("");
}
Jamie and Binary Sequence (changed after round) CodeForces - 916B (贪心)的更多相关文章
- Jamie and Binary Sequence (changed after round) - CodeForces 916B
http://codeforces.com/problemset/problem/916/B 好尬啊... #include<cstdio> #include<algorithm&g ...
- CodeForces 916B Jamie and Binary Sequence (changed after round) (贪心)
题意:给定两个数字n,m,让你把数字 n 拆成一个长度为 m 的序列a1,a2,a3...am,并且∑2^ai = n,如果有多组,要求序列中最大的数最小,然后再相同就要求除了最大数字典序最大. 析: ...
- Codeforces 916B - Jamie and Binary Sequence (changed after round)
思路: 先取出二进制的每一位,判断总个数是不是小于等于k,如果大于k则不能构成. 通过观察可以发现,每一位的一个可以转换成下一位的两个,因为要使最大位尽可能小,所以如果最大位的所有的个数都可以转换成下 ...
- CodeForces-916B-Jamie and Binary Sequence(changed after round)(构造)
链接: https://vjudge.net/problem/CodeForces-916B 题意: Jamie is preparing a Codeforces round. He has got ...
- 【Codeforces Round #457 (Div. 2) B】Jamie and Binary Sequence
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把n分解成二进制的形式. n=2^a0+2^a1+...+2^a[q-1] 则固定就是长度为q的序列. 要想扩展为长为k的序列. 可 ...
- Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )
题意 : 给出一个数 n ,要求你用 k 个二的幂来组成这个数,要求输出这 k 个二的幂的指数,如果有多解情况则优先输出最大指数最小的那一个且要求按字典序输出,不存在则输出 No 分析 : 先来说一 ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
There are n people and k keys on a straight line. Every person wants to get to the office which is l ...
随机推荐
- Js基础知识3-字符串、正则表达式全解
字符串的生成转换 你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: var myStr = num.toString(); // "19" var myStr ...
- 计算概论(A)/基础编程练习2(8题)/2:计算书费
#include<stdio.h> int main() { // 声明与初始化 ; // k组测试数据的总费用 double s[k]; // 单价表 double price[]= { ...
- 手撕vue-cli配置——utils.js篇
utils.js文件主要是用来处理各种css loader的,比如css-loader,less-loader等. //引入path模块 const path = require('path') // ...
- 学写网页 #04# w3school
索引: HTML 输入类型 XHTML HTML5 HTML5 样式指南和代码约定 WHO 成立于 1948 年. 对缩写进行标记能够为浏览器.翻译系统以及搜索引擎提供有用的信息. code 元素不保 ...
- 使用requireJS加载不符合AMD规范的js文件:shim的使用方式和实现原理
原文链接: http://www.bubuko.com/infodetail-671521.html
- 2017.7.4 ACM校内赛 Round 2
这是一个向导 A - hdu 3652 B - bzoj 4152 C - bzoj 2429 D - bzoj 1087 E - bzoj 1566 F - bzoj 4043 G - bzoj 1 ...
- SC命令---安装、开启、配置、关闭windows服务 bat批处理(转载)
转载:http://www.jb51.net/article/49627.htm 转载:http://blog.csdn.net/c1520006273/article/details/5053905 ...
- 定义c/c++全局变量/常量几种方法的区别(转载)
出自:http://www.cnblogs.com/yaozhongxiao/archive/2010/08/08/1795338.html 在讨论全局变量之前我们先要明白几个基本的概念: 1. 编 ...
- Python3基础 list 使用for循环 删除列表中的重复项
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 高通计划停用MSM 以SDM为移动平台命名【转】
本文转载自:http://www.eeworld.com.cn/xfdz/article_2017061566458.html 据外媒报道,高通公司计划停用骁龙移动平台型号前面的MSM字样,以SDM取 ...