LCA-雷达题解

雷达

题面

\(n \times n\) 的方格上,每个方格都有权值 \(a_{i,j}\) ,可花费 \(a_{i,j}\) 的代价覆盖以 \((i,j)\) 为中心,大小为 \(n \times n\) 的正方形区域。求最小的代价使得整片方格被覆盖。

题解

除了中心点选了能直接覆盖全部范围外,其余点选后,即使能覆盖得再多,也需要选其他点填补空缺。那么选什么区域的点,再怎么补能使得代价最小呢?显然这个问题我们无法轻易得知,我们需要对这个问题加以限制。题面中就有一个很强的限制,即每个点覆盖大小都是 \(n \times n\) 的正方形,容易发现最角落的点也能覆盖整片区域的四分之一,如果选择中轴上的点则至少覆盖二分之一。

这启发我们将整个方格按中轴分为四部分,现在任意在一个区域里选一个点,则能完成对该区域的覆盖(轴线上较为特殊,能一下覆盖两片区域),换言之,对于每片区域,我们选择其中代价最小的一个点即可达到最优策略,而想要覆盖整片区域,则对所有选点情况暴力枚举分讨即可。

代码

写成一坨了()

const int N=505;
const int inf=1e18;
int n,a[N][N],m,ans;
void xpigeon(){
    cin>>n;
    m=(n-1)/2+1;
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];

    int ans=a[m][m];

    int lup=inf;
    for(int i=1;i<=m-1;i++)
        for(int j=1;j<=m-1;j++)
            lup=min(lup,a[i][j]);

    int ldw=inf;
    for(int i=m+1;i<=n;i++)
        for(int j=1;j<=m-1;j++)
            ldw=min(ldw,a[i][j]);

    int rup=inf;
    for(int i=1;i<=m-1;i++)
        for(int j=m+1;j<=n;j++)
            rup=min(rup,a[i][j]);

    int rdw=inf;
    for(int i=m+1;i<=n;i++)
        for(int j=m+1;j<=n;j++)
            rdw=min(rdw,a[i][j]);

    int lmid=inf;
    for(int i=1;i<=m-1;i++)
        lmid=min(lmid,a[m][i]);

    int rmid=inf;
    for(int i=m+1;i<=n;i++)
        rmid=min(rmid,a[m][i]);

    int upmid=inf;
    for(int i=1;i<=m-1;i++)
        upmid=min(upmid,a[i][m]);

    int dwmid=inf;
    for(int i=m+1;i<=n;i++)
        dwmid=min(dwmid,a[i][m]);

    ans=min({ans,lup+rup+ldw+rdw,lmid+rup+rdw,rmid+lup+ldw,upmid+ldw+rdw,dwmid+lup+rup});
    ans=min({ans,lmid+rmid,upmid+dwmid,lmid+upmid+rdw,lmid+dwmid+rup,rmid+upmid+ldw,rmid+dwmid+lup});
    cout<<ans<<'\n';
}
posted @ 2025-11-13 21:41  香香的鸽子  阅读(8)  评论(0)    收藏  举报