【无标题】CF1661B Getting Zero

//预处理dist[]存每个值到mod的最小步数;因为宽搜有最短性质;
//倒着处理,


#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N=33000,mod=32768;

int n;
long long  dist[N];
long long  q[N];
long long ans[N];

void bfs()
{
	int hh=0,tt=0;
	q[0]=mod;
	memset(dist,-1,sizeof dist);
	dist[mod]=0;
	while(hh<=tt)
	{
		int t=q[hh++];
		// 顺着处理时: t=(v*2)%mod;
		// 所以倒着处理时: v=(t+mod)/2;
		
		//有三种拓展情况  
		int a[]={t-1,t/2,(t+mod)/2};
		
		for(int i=0;i<3;i++)
		{
			if(dist[a[i]]==-1)
			{
				dist[a[i]]=dist[t]+1;
				q[++tt]=a[i];
			}
		}
	}
	dist[0]=0;
	dist[mod]=1;
}

int main()
{
	cin>>n;
	bfs();
	while(n--)
	{
		int x;
		cin>>x;
		cout<<dist[x]<<' '; 
	}
	return 0;
}




// #include <iostream>
// #include <algorithm>
// #include <cstring>

// using namespace std;

// const int N=103000,mod=32768;

// int n;
// int dist[N];
// int q[N];

// int bfs(int x)
// {
// 	int hh=0,tt=0;
// 	q[hh]=x;
// 	memset(dist,-1,sizeof dist);
// 	dist[x]=0;
	
// 	while(hh<=tt)
// 	{
// 		int t=q[hh++];
// 		if(t%mod==0) return dist[t];
// 		int a1=(t+1)%mod;
// 		int a2=(t*2)%mod;
// 		if(dist[a1]==-1)
// 		{
// 			dist[a1]=dist[t]+1;
// 			q[++tt]=a1;
// 		}
		
// 		if(dist[a2]==-1)
// 		{
// 			dist[a2]=dist[t]+1;
// 			q[++tt]=a2;
// 		}
// 	}
// 	return -1;
// }

// int main()
// {
// 	cin>>n;
// 	while(n--)
// 	{
// 		int x;
// 		cin>>x;
// 		cout<<bfs(x)<<endl;
// 	}
// 	return 0;
// }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值