Solution

考虑从低位往高位贪心,设当前在处理第 \(i\) 位,更低位剩余的部分一共可以拼出 \(cnt\) 个 \(2^i\)

如果 \(n\) 的这一位是 \(1\) ,那么这一位就需要处理

  • 如果 \(cnt>0\),那么直接从 \(cnt\) 里拿一个,答案不变
  • 否则,暴力向更高位找到最小的那一个,比如它在 \(j\) 位,那么将 \(a_j\) 减 \(1\),同时将 \(a_{j-1},...,a_{i}\) 都加上 \(1\),并且答案增加 \(j-i\)

做完每一位后,维护一下 \(cnt\) 即可

(过晚了一分钟)

#include <bits/stdc++.h>
using namespace std; #define int long long
int T,n,m,t,a[66],cnt; signed main() {
ios::sync_with_stdio(false);
cin>>T;
while(T--) {
cin>>n>>m;
memset(a,0,sizeof a);
int sum=0;
for(int i=1;i<=m;i++) {
cin>>t;
for(int j=0;j<63;j++) {
if(t==(1ll<<j)) a[j]++;
}
sum+=t;
} cnt=0;
int ans=0,fg=0;
if(sum<n) fg=1;
for(int i=0;i<63;i++) {
if((n & (1ll<<i))) {
if(cnt>0) --cnt;
else if(a[i]>0) {
--a[i];
}
else {
int j=i+1;
while(a[j]==0 && j<63) ++j;
if(j==63) {
fg=1;
break;
}
else {
ans+=j-i;
a[j]--;
for(int k=i;k<j;k++) a[k]++;
}
}
}
cnt+=a[i];
cnt/=2;
} if(fg) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
}

最新文章

  1. 如何开发一个简单的HTML5 Canvas 小游戏
  2. Hexo主题实现多级分类显示
  3. python基础——高阶函数
  4. Dynamics AX 2012 R2 耗尽用户
  5. 2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件
  6. HDU 3065 病毒侵袭持续中
  7. iOS数据持久化
  8. SQL 复制订阅 异常后 强制删除
  9. HDU3368+枚举
  10. HTTP生命周期
  11. python编程基础知识—字典
  12. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述
  13. MFC打印
  14. Python全栈-magedu-2018-笔记6
  15. 「Link-Cut Tree」学习笔记
  16. javascript map forEach filter some every在购物车中的实战演练区分用法
  17. 通过网址request到response经历的过程
  18. How To Crop Bitmap For UWP
  19. beef局域网内模拟攻击
  20. H5 设备方向及运动API

热门文章

  1. 阿里云服务器ECS Ubuntu18.04 初次使用配置教程(图形界面安装)
  2. javascript 客户端webSocket示例
  3. KubeSphere企业级分布式多租户容器管理平台
  4. NOIP2012-------跳石头(C语言)
  5. javascript中onclick(this)用法介绍
  6. Quartz.NET - 课程 6: Cron 触发器
  7. redis教程-基础数据结构
  8. C# 中Trim()、TrimStart()、TrimEnd()、ToUpper()、ToLower()的用法
  9. python实现自动点赞
  10. Spark之RDD本质