Hack
查看原帖
Hack
670826
NianFeng楼主2024/8/30 20:59

rt。被 Hack 的题解为现题解区第一篇。Hack 数据一组:

30
23 7
23 27
14 1 12 0 36 17 23 13 21 0 30 0 13 6 26 36 34 13 19 27 35 15 36 8 36 30 35 34 5 0 

正确输出:

16

题解输出:

18

错误原因:考虑如图情况情况

OOOO
OOOOOO
OOOOXOOOO
OOOOOOO
OOO

其中,O 表示光标空,S 表示光标起点。那么,按照题解的做法,第 2、3、4 行的末尾是不会被放进优先队列的,有可能被其他点更新的时候不优于是寄掉。改一改就可以了。

错误代码示范示例:

for(int i=sr-1,j=sc;i>=1;i--){
    if(j>=a[i]+1){
        j=a[i]+1,dis[i*2]=sr-i;
        q.push(make_pair(-dis[i*2],i*2));
    }
}
for(int i=sr+1,j=sc;i<=n;i++){
    if(j>=a[i]+1){
        j=a[i]+1,dis[i*2]=i-sr;
        q.push(make_pair(-dis[i*2],i*2));
    }
}

正确代码示范:

for(int i=sr-1,j=sc;i>=1;i--){
    if(j>=a[i]+1){
        j=a[i]+1,dis[i*2]=sr-i;
        q.push(make_pair(-dis[i*2],i*2));
    } else if(j==sc){
        dis[i*2]=sr-i+a[i]+1-sc;
        q.push(make_pair(-dis[i*2],i*2));
    }
}
for(int i=sr+1,j=sc;i<=n;i++){
    if(j>=a[i]+1){
        j=a[i]+1,dis[i*2]=i-sr;
        q.push(make_pair(-dis[i*2],i*2));
    } else if(j==sc){
        dis[i*2]=i-sr+a[i]+1-sc;
        q.push(make_pair(-dis[i*2],i*2));
    }
}

区别很明显。

2024/8/30 20:59
加载中...