Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
2024-09-03 03:25:06
题意:给你一组全是\(2^d\ (d\ge0)\)的数,询问q次,每次询问一个数,问这个数是否能够由原数组中的数相加得到,如果能,输出最少用多少个数,否则输出\(-1\).
题解:首先贪心得出结论:如果情况成立,那么最少的情况一定是优先用数组中大的数,然后我们用桶记录数组数的个数,从\(inf\)开始枚举,\(k\)表示桶中的数和\(x\)所需次数的最小值,最后如果\(x\ne 0\)那么条件不满足,否则输出\(ans\)即可.
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL; int n,q;
int x;
int ans;
map<int,int> mp; int main() {
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>q;
for(int i=1;i<=n;++i){
cin>>x;
mp[x]++;
} while(q--){
cin>>x;
ans=0;
for(int i=1<<30;i>=1;i/=2){
int k=min(mp[i],x/i);
ans+=k;
x-=k*i;
}
if(x) puts("-1");
else printf("%d\n",ans);
}
return 0;
}
最新文章
- case when 对某个字段值分类讨论
- ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中(四)
- 使用RSA非对称密钥算法实现硬件设备授权
- 有关IT的小笑话
- Python操作Redis的5种数据类型
- WPF入门介绍
- tomcat Server.xml Context配置问题
- C#的扩展方法(this)
- Entity Framework入门教程(17)---记录和拦截数据库命令
- UVA 508 Morse Mismatches JAVA
- Linux&#160;学习笔记之超详细基础linux命令&#160;Part&#160;12
- firefox浏览器testclient测试接口
- JSTL核心标签库——重定向标签、URL处理标签、网页导入标签
- 最简单的XML用法
- Apache ActiveMQ Fileserver远程代码执行漏洞
- SVN的使用----经历
- STL 容器的概念
- mvc框架的学习步骤
- beego 笔记
- 使用Sublime经验分享