站外题求助
  • 板块题目总版
  • 楼主穼柗°
  • 当前回复13
  • 已保存回复13
  • 发布时间2024/7/26 13:21
  • 上次更新2024/7/26 14:34:18
查看原帖
站外题求助
1045961
穼柗°楼主2024/7/26 13:21

题目描述

有一个变量 xx,初始为 11,现在需要经过若干次操作,将 xx 变为 nn。

每次操作可以将 xx 变为 x+1x+1 或 x−1x-1,新得到的数必须在 11 ~ nn 的范围内。

特别的,还有 kk 个数字 aia_i。

若当前 xx 是 aia_i 的倍数,则可以将 xx 转化为 11 ~ nn 范围内任意的 aia_i 的倍数。

问将 xx 变为 nn 的最小操作次数是多少。


我的思路是广搜,但是 TLE,代码如下。

#include <algorithm>
#include <cstdio>
#include <queue>
std::queue<int> q;
int n,k,dis[2000001],a[10];
int main() {
	scanf("%d%d",&n,&k);
	std::fill(dis+2,dis+n+1,1000000000);
	for(register int i=0;i<k;i++)
		scanf("%d",a+i);
	q.push(1);
	register int x;
	while(q.size()) {
		x=q.front();
		if(x==n)
			return !printf("%d",dis[x]);
		q.pop();
		if(x>1)
			if(dis[x-1]>dis[x]+1)
				q.push(x-1),
				dis[x-1]=dis[x]+1;
		if(x<n)
			if(dis[x+1]>dis[x]+1)
				q.push(x+1),
				dis[x+1]=dis[x]+1;
		for(register int c,i=0;i<k;i++)
			if(!(x%a[i]))
				for(c=a[i];c<=n;c+=a[i])
					if(dis[c]>dis[x]+1)
						q.push(c),
						dis[c]=dis[x]+1;
	}
	return 0;
}
2024/7/26 13:21
加载中...