MLE+WA求调

P2895 [USACO08FEB] Meteor Shower S

jinminghao @ 2024-09-26 20:29:47


#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=310;
struct Node{
    int x,y,sum;
};
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int a[N][N];
queue<Node> q;
int bfs(){
    Node v;
    v.x=0; v.y=0; v.sum=0;
    q.push(v);
    while(!q.empty()){
        Node t=q.front();
        q.pop();
        int tx=t.x,ty=t.y,res=t.sum;
        if(a[tx][ty]==-1) return res;
        for(int i=0;i<4;i++){
            int nx=tx+dx[i],ny=ty+dy[i];
            if(nx>=0&&ny>=0&&(a[nx][ny]==-1||a[nx][ny]>res+1)){
                Node k;
                k.x=nx; k.y=ny; k.sum=res+1;
                q.push(k);
            }
        }
    }
    return -1;
}
int main(){
    memset(a,-1,sizeof a);
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int x,y,t;
        scanf("%d%d%d",&x,&y,&t);
        a[x][y]=t;
        for(int j=0;j<4;j++){
            int tx=x+dx[j],ty=y+dy[j];
            if(tx>=0&&ty>=0){
                if(a[tx][ty]==-1) a[tx][ty]=t;
                else a[tx][ty]=min(a[tx][ty],t);
            }
        }
    }
    int ans=bfs();
    printf("%d",ans);
    return 0;
}

by lingquan @ 2024-09-30 15:58:19

WA的点是因为第41行初始化a数组被砸的点时a[x][y]没有判断最小的被砸时间


by lingquan @ 2024-09-30 16:27:08

MLE是因为重复搜点,有两种解决办法:\ 1、定义flag数组判断是否重复搜点;\ 2、a[x][y]=res+1;


by lingquan @ 2024-09-30 16:30:50

AC代码如下: \ \ \ \ flag数组写法:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=310;

struct Node{
    int x,y,sum;
};

int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int a[N][N];
bool flag[N][N];
queue<Node> q;

int bfs(){
    q.push({0,0,0});
    flag[0][0]=1;
    while(!q.empty()){
        Node t=q.front();
        q.pop();
        int res=t.sum;
        for(int i=0;i<4;i++){
            int nx=t.x+dx[i],ny=t.y+dy[i];
            if(nx>=0 && nx<=310 && ny>=0 && ny<=310 && flag[nx][ny]==0){
                if(a[nx][ny]==-1){
                    return res+1;
                }else{
                    if(a[nx][ny]>res+1){
                        flag[nx][ny]=1;
                        q.push({nx,ny,res+1});
                    }
                }
            }
        }
    }
    return -1;
}

int main(){
    memset(a,-1,sizeof a);
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int x,y,t;
        scanf("%d%d%d",&x,&y,&t);
        a[x][y]==-1?a[x][y]=t:a[x][y]=min(a[x][y],t);
        for(int j=0;j<4;j++){
            int tx=x+dx[j],ty=y+dy[j];
            if(tx>=0 && ty>=0){
                if(a[tx][ty]==-1) a[tx][ty]=t;
                else a[tx][ty]=min(a[tx][ty],t);
            }
        }
    }
    int ans=bfs();
    printf("%d",ans);
    return 0;
}

\ \ a[x][y]=res+1写法:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=310;

struct Node{
    int x,y,sum;
};

int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int a[N][N];
queue<Node> q;

int bfs(){
    q.push({0,0,0});
    while(!q.empty()){
        Node t=q.front();
        q.pop();
        int res=t.sum;
        for(int i=0;i<4;i++){
            int nx=t.x+dx[i],ny=t.y+dy[i];
            if(nx>=0 && nx<=310 && ny>=0 && ny<=310){
                if(a[nx][ny]==-1){
                    return res+1;
                }else{
                    if(a[nx][ny]>res+1){
                        a[nx][ny]=res+1;
                        q.push({nx,ny,res+1});
                    }
                }
            }
        }
    }
    return -1;
}

int main(){
    memset(a,-1,sizeof a);
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int x,y,t;
        scanf("%d%d%d",&x,&y,&t);
        a[x][y]==-1?a[x][y]=t:a[x][y]=min(a[x][y],t);
        for(int j=0;j<4;j++){
            int tx=x+dx[j],ty=y+dy[j];
            if(tx>=0 && ty>=0){
                if(a[tx][ty]==-1) a[tx][ty]=t;
                else a[tx][ty]=min(a[tx][ty],t);
            }
        }
    }
    int ans=bfs();
    printf("%d",ans);
    return 0;
}

by jinminghao @ 2024-09-30 19:45:44

@lingquan 谢谢


|