Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )
题意 : 给出一个数 n ,要求你用 k 个二的幂来组成这个数,要求输出这 k 个二的幂的指数,如果有多解情况则优先输出最大指数最小的那一个且要求按字典序输出,不存在则输出 No
分析 :
先来说一个结论对于一个二的幂例如 2^n 我们可以将其拆成 2^(n-1) + 2^(n-1)
那么对于题目所给出的数 n 我们可以先将其拆成二进制形式,如果当前二进制表示法中 1 的个数已经超过 k 则应该是输出 No
也就是说无论怎么转化都不可能有用更少的二的幂的个数来表示这个数,只能更多,也就是利用上面一拆多的结论
那么接下来就是用上述结论去一位位拆,为了保证拆出来的是符合题目要求的,按如下方式拆
首先为了保证最大的二的幂指数尽量小,我们始终从最高位拆
但是为了不超过 k 这个限制,当 2*最高位的二的幂的数量已经大于当前需要补充的数时候
这时候我们无法使得最大的二的幂被拆掉,所以为了保证字典序最小,我们此时从最低位开始拆
举个例子来说就是假设当前 n = 1010 (这里是二进制表示)、k = 4
那么一开始 n = 2^3 + 2^1 还需要补充 2 个二的幂
那么从最高位开始拆,变成 n = 2^2 + 2^2 + 2^1
此时还差 1 个二的幂,不过这个时候不能去拆最大的二的幂
应该拆 2^1 才能保证字典序
最后 n = 2^2 + 2^2 + 2^0 + 2^0
#include<bits/stdc++.h>
#define LL long long
using namespace std;
;
int k, cnt, lowbit, idx, arr[maxn];
LL n;
int main(void)
{
lowbit = -;
scanf("%I64d %d", &n, &k);
while(n){/// 先把 n 拆成二进制数
){
cnt++;/// n 的二进制表示法中 1 的数量
arr[idx]++;/// 记录当前二进制 1 所代表到底是哪个幂,例如 arr[2] => 2^2
)
lowbit = idx;
}
n >>= ;
idx++;/// n 的二进制表示法中有效位长
}
lowbit = (idx-)-lowbit;/// 计算出 n 的二进制表示法中最低位的那个 1 是第几位
std::reverse(arr, arr+idx);
//----------Debug-------------------
// for(int i=0; i<idx; i++)
// printf("%d ", arr[i]);
// puts("");
// printf("%d %d\n", idx, lowbit);
//----------Debug-------------------
if(cnt > k){/// No 的情况
puts("No");
;
}
;; i++){///从最高位开始进行拆分操作
if(cnt == k) break;
if(k - cnt < arr[i]) break;
cnt += arr[i];
arr[i+] += arr[i]<<;
arr[i] = ;
lowbit = max(lowbit, i+);
}
//------------Wrong!!!-----------------------
// while(cnt != k){
// if(arr[lowbit] >= k - cnt){
// arr[lowbit] -= k-cnt;
// arr[lowbit+1] += (k-cnt)<<1;
// cnt = k;
// }else{
// arr[lowbit+1] += arr[lowbit]<<1;
// cnt += arr[lowbit];
// arr[lowbit] = 0;
// }
// lowbit += 1;
// }
//------------Wrong!!!-----------------------
while(cnt != k){///Greedy!!!
cnt++;
arr[lowbit]--;
arr[++lowbit] += ;
}
puts("Yes");
; i<=lowbit; i++){
while(arr[i]){
arr[i]--;
printf(-i);
}
}puts("");
;
}
Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )的更多相关文章
- 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则不能构成. 通过观察可以发现,每一位的一个可以转换成下一位的两个,因为要使最大位尽可能小,所以如果最大位的所有的个数都可以转换成下 ...
- Jamie and Binary Sequence (changed after round) - CodeForces 916B
http://codeforces.com/problemset/problem/916/B 好尬啊... #include<cstdio> #include<algorithm&g ...
- Jamie and Binary Sequence (changed after round) CodeForces - 916B (贪心)
链接 大意: 求将n划分为k个2的幂的和, 且最大幂最小,字典序尽量大 比较简单的贪心练习题, 但放在div2的B题感觉偏难了..... 先只考虑最大幂最小, 首先注意到直接按n的二进制划分即可得到最 ...
- 【Codeforces Round #457 (Div. 2) B】Jamie and Binary Sequence
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把n分解成二进制的形式. n=2^a0+2^a1+...+2^a[q-1] 则固定就是长度为q的序列. 要想扩展为长为k的序列. 可 ...
- Codeforces Beta Round #13 C. Sequence (DP)
题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...
- 模拟+思维 HDOJ 5319 Painter
题目传送门 /* 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最 ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子
一起来学演化计算-SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子 觉得有用的话,欢迎一起讨论相互学习 ...
随机推荐
- LeetCode算法题-Most Common Word(Java实现)
这是悦乐书的第321次更新,第342篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第190题(顺位题号是819).给定一个段落和一组禁止词,返回不在禁止词列表中的最常用词 ...
- C语言实现单链表
大二学习数据结构和算法啦,因为之前用Java语言实现过,所以理解起来还是比较轻松,就是理解指针与结构体的运用.废话不多说,上代码! 初始化 typedef struct Node { int data ...
- 【Linux开发】【Qt开发】tslibs的配置(触摸屏没有,HDMI屏幕):Qt界面响应USB鼠标
s3c2416 linux qt4.x 由于触摸屏坏了,板子只能用鼠标了,结果以前可以用的现在鼠标突然不能用了 为此交叉编译了qt的多个版本,也换过根文件系统,以为是tslib版本的问题,却发现q ...
- 第九周课程总结&实验报告七
实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. package ...
- UrlConnection发送http请求 中文乱码解决
中文乱码 DataOutputStream dos = new DataOutputStream(httpConn.getOutputStream()); //dos.writeBytes(jsonD ...
- Python模块logging
基本用法: import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = logging.getLogger("A ...
- Linux环境安装mongodb
介绍 上篇介绍了Linux环境下安装Node.js的步骤,紧接着来安装mongodb.另外,推荐我的另一篇 Windows下图文详解Mongodb安装及配置,先在Windows下熟悉下mongodb, ...
- Text Autosizer&&解决移动端网页文本字体怪异增大问题
在做移动端页面时,有时你设置了字体大小,有的部分即使设置了行内样式也不生效,而有些显示正常,这个特性就是Text Autosizer在搞鬼. 以下是解决方案: ①给元素设置 -webkit-text- ...
- vue表单校验(三)
vue表单校验(三) 每当看到heyui的这个表单校验,我就一直想将element的校验也做类似的功能,终于有了方式,虽然不是很完美,但是可以使用,能满足要求了 实现方式 基于element-ui实现 ...
- TMS320F28335——SPI使用笔记
一.SPI硬件接口 GPIO54 ------- SPISIMOA GPIO55 ------- SPISOMIA GPIO56 ------- SPCLK GPI ...