codeforce 457DIV2 B题
2024-08-29 04:32:00
题意:
题目给出两个整数n,k,(n<=10^18,k<=10^5),求一个含有k个整数的序列,要求以2为底,以序列内数字为幂的和为n,其中序列内最大的数最小,若有多个序列满足条件,输出字典序最大的一个。
样例:input :23 5 output:Yes 3 3 2 1 0 ,其中2^3+2^3+2^2+2^1+2^0=23=n
分析
两个点:1:2^n=2*2^n-1,也就是说答案序列中任何一个数x都可以变为两个x-1
2: 结合二进制化十进制的方法,可以得到用2的幂次方表示的n
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
long long n;
int k;
map<int,int>b;
int main(){
cin>>n>>k;
int m=;
while(n){
b[m]=n&;
n/=;
if(b[m++])k--;
}
if(k<){
printf("No");
return ;
}
m--;
int i;
for(i=m;;i--){//使最大值最小
if(b[i]>k)break;
b[i-]+=*b[i];
k-=b[i];
b[i]=;
}
int j;
for(j=min(,i);j<=i;j++)if(b[j])break;
for(;;j--){
if(!k)break;
if(b[j]){
b[j]--;
b[j-]+=;
k--;}
}
printf("Yes\n");
for(int ll=m;ll>=j;ll--)
for(int l=;l<=b[ll];l++)printf("%d ",ll);
return ;
}
最新文章
- Cookie工具类
- phaser源码解析(二) Phaser.Utils类下pad方法
- tcp-backlog配置
- 编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。
- SignalR 聊天室实例详解(服务器端推送版)
- 【Demo 0010】Java基础-泛型
- HDU 4643 GSM 简单计算几何
- Math 对象 识记
- SQL查询和删除重复字段的内容
- UNIX网络编程——基于UDP协议的网络程序
- 【spring实战第五版遇到的坑】第14章spring.cloud.config.uri和token配置项无效
- 以实例说明微服务拆分(以SpringCloud+Gradle)
- random模块、time模块、sys模块、os模块
- mac pfctl / centos iptables 使用
- 【DL】几种参数优化方法的比较
- IOS延时加载网络图片
- ASP.NET MVC使用AuthenticationAttribute验证登录
- 当Web访问性能出现问题,如何深探?
- Django之路 - 实现登录随机验证码
- selenium 结合 docker 构建分布式测试环境 (初学者视角)
热门文章
- matlab将矩阵写入文件
- JavaScript 中 this:
- 卷积神经网络实战-----0001(移植卷积神经网络c++ to python or java)
- [QT][问题]关于QT语言家使用失败的原因之一
- 【英语】Bingo口语笔记(84) - 惊讶的表达
- Cloudera Manager (centos)安装详细介绍
- vc++ windows 创建桌面快捷方式
- EasyWeChat微信开放平台第三方平台接入
- Does Windows have a limit of 2000 threads per process?
- 使用CMake生成sln项目和VS工程遇到的问题