社区讨论

RE求调

P2895[USACO08FEB] Meteor Shower S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjdojsa
此快照首次捕获于
2025/11/04 00:52
4 个月前
此快照最后确认于
2025/11/04 00:52
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define maxn 310
using namespace std;
int m,Ans=100000,ans[maxn][maxn],death[maxn][maxn],d[4][2]={{0,1},{1,0},{-1,0},{0,-1}};//ans[i][j]表示第i行第j列格子的最短到达时间
struct coord{
	int x,y;
};
queue<coord>Q;
int read() {
	int s=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)) {
		s=s*10+ch-'0';
		ch=getchar();
	}
	return f*s;
}
void write(int n) {
	if(n<0) putchar('-'),n=-n;
	if(n<10) putchar(n+'0');
	else write(n/10),putchar(n%10+'0');
}
void MIN(int x,int y,int t) {
    //保存当前格子被流星砸中的最小时间
    if(x>=0&&y>=0) death[x][y]=min(death[x][y],t);
}
int main() {
	m=read();
	memset(ans,-1,sizeof(ans));
	memset(death,0x7f,sizeof(death));
	for(int i=1;i<=m;i++) {
		int x,y,t;
		x=read();y=read();t=read();
		MIN(x,y,t);
		for(int k=0;k<4;k++)
			MIN(x+d[k][0],y+d[k][1],t);
	}
	ans[0][0]=0;
	Q.push((coord){0,0});
	while(!Q.empty()) {
		coord u=Q.front();
		int ux=u.x,uy=u.y;
		Q.pop();
		for(int k=0;k<4;k++) {
			int x=ux+d[k][0],y=uy+d[k][1];//生成下一层节点
			if(x<0||y<0||ans[x][y]!=-1||ans[ux][uy]+1>=death[x][y]) continue;//不合法直接跳过
			ans[x][y]=ans[ux][uy]+1;
			Q.push((coord){x,y});
		}
	}
	for(int i=0;i<310;i++)
		for(int j=0;j<310;j++)
			if(death[i][j]>1000&ans[i][j]!=-1)
				Ans=min(Ans,ans[i][j]);//找最优解
	if(Ans==100000) puts("-1");
	else write(Ans);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...