[CF1303D] Fill The Bag - 贪心
2024-08-31 13:50:46
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;
}
}
最新文章
- 如何开发一个简单的HTML5 Canvas 小游戏
- Hexo主题实现多级分类显示
- python基础——高阶函数
- Dynamics AX 2012 R2 耗尽用户
- 2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件
- HDU 3065 病毒侵袭持续中
- iOS数据持久化
- SQL 复制订阅 异常后 强制删除
- HDU3368+枚举
- HTTP生命周期
- python编程基础知识—字典
- Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述
- MFC打印
- Python全栈-magedu-2018-笔记6
- 「Link-Cut Tree」学习笔记
- javascript map forEach filter some every在购物车中的实战演练区分用法
- 通过网址request到response经历的过程
- How To Crop Bitmap For UWP
- beef局域网内模拟攻击
- H5 设备方向及运动API
热门文章
- 阿里云服务器ECS Ubuntu18.04 初次使用配置教程(图形界面安装)
- javascript 客户端webSocket示例
- KubeSphere企业级分布式多租户容器管理平台
- NOIP2012-------跳石头(C语言)
- javascript中onclick(this)用法介绍
- Quartz.NET - 课程 6: Cron 触发器
- redis教程-基础数据结构
- C# 中Trim()、TrimStart()、TrimEnd()、ToUpper()、ToLower()的用法
- python实现自动点赞
- Spark之RDD本质