社区讨论

一些些疑问

P1457[USACO2.1] 城堡 The Castle参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjubn5g
此快照首次捕获于
2025/11/04 08:38
4 个月前
此快照最后确认于
2025/11/04 08:38
4 个月前
查看原帖
在遍历墙的时候,为什么要先j从1到m,再i从n到1,这样子才能得到题目中的“靠西,靠南”的方案
我的做法是假如存在多解,对ansx取一个max,对ansy取一个min,为什么这样子不对
错误解法:
CPP
for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=2;k++)
                if(h[i][j][k])
                {
                    int rx = i+dx[k],ry = j+dy[k];
                    int news = s[id[i][j]]+s[id[rx][ry]];
                    if(news>maxs && id[i][j]!=id[rx][ry])
                    {
                        maxs = news;
                        ansx = i;
                        ansy = j;
                        if(k == 1) ansd = 'N';
                        else ansd = 'E';
                    }
                    else if(news == maxs && id[i][j]!=id[rx][ry])
                    {
                        ansx = max(ansx,i);
                        ansy = min(ansy,j);
                    }
                }
    cout << maxs << endl << ansx << " " << ansy << " " << ansd;
正确解法:
CPP
for(int j=1;j<=m;j++)
        for(int i=n;i>=1;i--)
            for(int k=1;k<=2;k++)
                if(h[i][j][k])
                {
                    int rx = i+dx[k],ry = j+dy[k];
                    int news = s[id[i][j]]+s[id[rx][ry]];
                    if(news>maxs && id[i][j]!=id[rx][ry])
                    {
                        maxs = news;
                        ansx = i;
                        ansy = j;
                        if(k == 1) ansd = 'N';
                        else ansd = 'E';
                    }
                }
    cout << maxs << endl << ansx << " " << ansy << " " << ansd;

回复

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

正在加载回复...