其他分享
首页 > 其他分享> > 【题解】引水入城

【题解】引水入城

作者:互联网

引水入城题解

NOIp2010T4 题解

首先,这是本人的第一道独立AC的蓝题

\(n==1\)时,只有一排城市,这一排城市既临湖又临沙漠。
那么,易得一定有合法方案。而且只需找出这一排高度极大值山顶或平台都有蓄水场就能满足要求。(要注意端点也要考虑)
易得:如果我们把\(mp_{1,0}\)和\(mp_{1,m}\)都赋值为\(0\),那么只需在\(mp_{1,i}>mp_{1,i-1}\&\&mp_{1,i}>mp_{1,i+1}\)时需要在该点建蓄水厂,否则,该点一定可以被其他城市流出的水流经,无需再建蓄水厂。

code 10pts

#include<cstdio>
#include<iostream>
using namespace std;
const int N=505;
int n,m;
int mp[N][N],up[N],ans;

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&mp[i][j]);
    if(n==1)
    {
        for(int i=1;i<=m;i++)
            if(mp[1][i]>=mp[1][i-1]&&mp[1][i]>=mp[1][i+1])
                ans++;
        printf("%d\n%d",1,ans);
        return 0;
    }
}

只需要以第一行的每一个点为起点跑一次BFS,对跑到的每一个点打标记,最后统计最后一行没有标记的点,如果存在这样的点,\(ans++\); 如果最后\(ans\)不为零,第一行输出\(0\),第二行输出\(ans\);反之,第一行输出\(1\),然后输出随机数(大雾

code 10pts+30pts=40pts

#include<queue>
#include<cstdio>
#include<iostream>
using namespace std;
int m,n;
const int N=505;
int mp[N][N],hi[N],vis[N][N],cnt,num;
int sum,ans;
int dir1[]={0,0,0,1,-1};
int dir2[]={0,1,-1,0,0};
struct node
{
    int x,y;
};
queue<node>q;
void bfs(int x,int y)
{
    q.push((node){x,y});vis[x][y]=1;
    while(!q.empty())
    {
        int x=q.front().x,y=q.front().y;q.pop();
        for(int i=1;i<=4;i++)
        {
            if(x+dir1[i]>n||x+dir1[i]<1||y+dir2[i]>m||y+dir2[i]<1)
                continue;
            if(vis[x+dir1[i]][y+dir2[i]]) continue;
            if(mp[x+dir1[i]][y+dir2[i]]<mp[x][y])
                q.push((node){x+dir1[i],y+dir2[i]}),vis[x+dir1[i]][y+dir2[i]]=1;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&mp[i][j]);
    if(n==1)
    {
        for(int i=1;i<=m;i++)
            if(mp[1][i]>=mp[1][i-1]&&mp[1][i]>=mp[1][i+1])
                ans++;
        printf("%d\n%d",1,ans);
        return 0;
    }
    for(int i=1;i<=m;i++)
        if(mp[1][i]>=mp[1][i-1]&&mp[1][i]>=mp[1][i+1])
            hi[++cnt]=i,bfs(1,i);
    for(int i=1;i<=m;i++)
        if(!vis[n][i]) sum++;
    if(sum)
    {
        printf("%d\n%d",0,sum);
        return 0;
    }
}

本篇题解::return 0;

标签:int,题解,mp,ans,区间,引水,include,dp
来源: https://www.cnblogs.com/why-Y/p/13905086.html