日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NOIP 2010 引水入城

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 引水入城的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。