一道有趣の结论题的有趣の结论
查看原帖
一道有趣の结论题的有趣の结论
753440
newamnesia楼主2023/9/13 21:24

本题的 01 bfs 解法是由 xx 向 x+1x+1 和 x×10x\times10 转移,还有一种最短路的做法是由 xx 向 x×10+y(y∈[0,9])x\times10+y(y\in[0,9]) 转移。都是按照每位计贡献的思路,而本人采用的是后者,关键代码如下:

struct num{
    int x, val;
    friend bool operator < (const num a, const num b){
        return a.val > b.val;
    }
};priority_queue<num> heap;

int main(){

    for(int i = 1; i < n; ++ i )//建边,注意没有同一位之间的转移
        for(int j = 0; j < 10; ++ j )
            adds(i, (i * 10 + j) % n, j);


    memset(dis, 0x3f, sizeof dis);
    heap.push((num){1, dis[1] = 1});//本文重点※

    while(!heap.empty()){
        //最短路...
    }
  
    ...
 
}

可以看到,代码中本人只钦定了最高位为 11 的情况,而正确做法应该是将 11 到 99 都放入堆中——可这样是能 AC 的。

我怀疑是 AT 数据不完善的原因,又找了一份题解区的(第一篇) 01 bfs 代码对拍。截止本帖发布大概已经拍完 k≤3×104k\le3\times10^4 的所有情况但没有发现矛盾。


如果各位并没有理解我发帖的目的,那么在这里强调一下:这份“错误”的代码钦定了最高位为 11,也就是对于每个 kk 来说,数位和最优的倍数的最高位都是 11。在此向各位大佬求助证明或推翻这个结论。

2023/9/13 21:24
加载中...