2024年码蹄杯高职组初赛第二场 H题 亲近数 题型:预处理 难度:白银 独立完成

45 阅读1分钟

码题集OJ-亲近数 (matiji.net)

思想

首先我们可以看见n非常大,是1e9:

image.png

根据题面我们可以想到2322^{32}就已经大于1e9了

image.png

因此我们可以预处理一个power[]数组,这个数组存212^{1} ~ 2322^{32}的所有2幂数.

对于输入的n,我们就去遍历power数组,也就只需要遍历下标1~32而已.这是一个很小的量.然后对于每一个power[i]我们都将n与之相减取绝对值,最后看哪个值更小,说明n与哪个2幂数更亲近.

这个时候有两个情况,一个是n前面的2幂数,一个是n后面的2幂数,我们就要输出更小的那个二幂数.

#include<bits/stdc++.h> 
#define int long long
#define IN 32
using namespace std;

int power[IN];
int minn=1e9+10;
signed main()
{
	cin.tie(nullptr)->sync_with_stdio(0);
	int x;cin>>x;

	
	for(int i=1;i<=IN;i++)
	{
	  power[i]=pow(2,i);
	} 


	for(int i=1;i<=IN;i++)
	{
		int t=abs(x-power[i]);
		minn=min(minn,t);
	}
	
	
	for(int i=1;i<=IN;i++)
	{
	int t1=x-minn;
	int t2=x+minn;
	if(t1==power[i] && t2==power[i])
	{
		cout<<t1;
		break;
	}
	else if(t1==power[i])
	
	{
		cout<<t1;
		break;
	 } 
	else if(t2==power[i]) 
	{
		cout<<t2;
		break;
	}
	}
	return 0;
}

image.png

评论区里的题解和我的想法一样但是代码更简洁:

image.png