CF1095C Powers Of Two

本文详细解析了CF1095C题目PowersOfTwo的解题思路与代码实现。介绍了如何将输入整数n分解为若干个2的幂次方数之和,并确保分解后的数的数量不超过给定限制k。通过具体算法和C++代码示例,阐述了解决方案的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:CF1095C Powers Of Two

思路:
如果不考虑输出结果,可以考虑把n分成尽量大的数。
如果考虑输出结果,且分得得数数量不够,就把一些大于1的数分成两个就好了。

代码:

#include<bits/stdc++.h>
using namespace std;

#define read(x) scanf("%d",&x)

int n,k;
vector<int> ans;

int main() {
	read(n),read(k);
	if(k>n) {printf("NO");return 0;}
	for(int i=30;i>=0;i--) {
		while(n>=(1<<i)) n-=(1<<i),ans.push_back(1<<i);
	}
	if((int)ans.size()>k) printf("NO");
	else {
		int t=0;
		while(k>ans.size()) {
			while(ans[t]<=1) t++;
			ans[t]/=2;ans.push_back(ans[t]);
		}
		printf("YES\n");
		for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值