样例挂了80pts求助
查看原帖
样例挂了80pts求助
1287433
__ycy1124__楼主2024/9/27 12:58
#include<bits/stdc++.h>
#define int long long int
using namespace std;
struct Node{
	int p,w,las; 
};
int c[21];
int ans[1001][21];
queue <Node> q;
int n,m;
void bfs(int p,int w,int las){
//	printf("%d %d %d\n",p,w,las);
	ans[p][las]=w;
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=m;j++){
//			printf("%d ",ans[i][j]);
//		}
//		printf("\n");
//	}
	for(int i=1;i<=m;i++){
		if(p+c[i]<=n&&(p+c[i])>=1&&((ans[p+c[i]][i]==-1)||(w+abs(las-i)+abs(c[i]*2)<ans[p+c[i]][i]))){
			q.push({p+c[i],w+abs(las-i)+abs(c[i]*2),i});
			ans[p+c[i]][i]=w+abs(las-i)+abs(c[i]*2);
		}
	}
}
signed main(){
	scanf("%d%d",&n,&m);
	int az;
	for(int i=1;i<=m;i++){
		scanf("%d",&c[i]);
		if(c[i]==0){
			az=i;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans[i][j]=-1;
		}
	}
	q.push({1,0,az});
	while(!q.empty()){
		bfs(q.front().p,q.front().w,q.front().las);
		q.pop();
	}
	int js=-1;
	for(int i=1;i<=m;i++){
		if(js==-1){
			js=ans[n][i];
		}
		else{
			js=min(js,ans[n][i]);
		}
	}
//	for(int i=1;i<=n;i++){
//		printf("%d ",ans[i][1]);
//	}
//	printf("\n");
	printf("%lld",js);	
	return 0;
}

别问为什么不用dij,因为想试试bfs能不能过

2024/9/27 12:58
加载中...