NOIP 2010 引水入城
P1514 引水入城
題目描述
在一個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成一個?NN?行?\times M×M?列的矩形,如上圖所示,其中每個格子都代表一座城市,每座城市都有一個海拔高度。
為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水泵將湖泊中的水抽取到所在城市的蓄水池中。
因此,只有與湖泊毗鄰的第?11?行的城市可以建造蓄水廠。而輸水站的功能則是通過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。由于第?NN?行的城市靠近沙漠,是該國的干旱區,所以要求其中的每座城市都建有水利設施。那么,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求干旱區中不可能建有水利設施的城市數目。
輸入輸出格式
輸入格式:?
每行兩個數,之間用一個空格隔開。輸入的第一行是兩個正整數?N,MN,M?,表示矩形的規模。接下來?NN?行,每行?MM?個正整數,依次代表每座城市的海拔高度。
?
輸出格式:?
兩行。如果能滿足要求,輸出的第一行是整數?11?,第二行是一個整數,代表最少建造幾個蓄水廠;如果不能滿足要求,輸出的第一行是整數?00?,第二行是一個整數,代表有幾座干旱區中的城市不可能建有水利設施。
?
輸入輸出樣例
輸入樣例#1:?復制 2 5 9 1 5 4 3 8 7 6 1 2 輸出樣例#1:?復制 1 1 輸入樣例#2:?復制 3 6 8 4 5 6 4 4 7 3 4 3 3 3 3 2 2 1 1 2 輸出樣例#2:?復制 1 3說明
【樣例1 說明】
只需要在海拔為?99?的那座城市中建造蓄水廠,即可滿足要求。
【樣例2 說明】
上圖中,在?33?個粗線框出的城市中建造蓄水廠,可以滿足要求。以這?33?個蓄水廠為源頭在干旱區中建造的輸水站分別用3 種顏色標出。當然,建造方法可能不唯一。
【數據范圍】
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define maxn 501 using namespace std; int n,m,l,r; int f[maxn],vi[maxn]; struct node{ int mn,mx; }v[maxn]; int map[maxn][maxn],vis[maxn][maxn]; int e[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; void dfs(int x,int y,int num){if(x==n){vi[y]=1;v[num].mx=max(v[num].mx,y);v[num].mn=min(v[num].mn,y);}for(int i=0;i<4;i++){int cx=x+e[i][0];int cy=y+e[i][1];if(!vis[cx][cy]&&cx<=n&&cx>=1&&cy<=m&&cy>=1&&map[cx][cy]<map[x][y]){vis[cx][cy]=1;dfs(cx,cy,num);}} } int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) v[i].mn=0x7fffffff;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&map[i][j]); for(int i=1;i<=m;i++){if(map[1][i-1]<=map[1][i]&&map[1][i]>=map[1][i+1])memset(vis,0,sizeof(vis));vis[1][i]=1;dfs(1,i,i);}int count=0;for(int i=1;i<=m;i++) count+=vi[i];if(count<m){ printf("0\n%d",m-count); return 0; }memset(f,63,sizeof(f));f[0]=0;for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)if(i<=v[j].mx&&i>=v[j].mn)f[i]=min(f[i],f[v[j].mn-1]+1);printf("1\n%d",f[m]); }
?
轉載于:https://www.cnblogs.com/cangT-Tlan/p/9317433.html
總結
以上是生活随笔為你收集整理的NOIP 2010 引水入城的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间序列分析综述
- 下一篇: 计算机基础:计算机网络-socket编程