Codevs 1066 引水入城

2021-07-26 12:12:09 字數 2107 閱讀 4332

你要的原題哦!

題意

原題說的很明白,並不難理解,就是上面的點可以順高度梯度擴充套件到下面的點。一種情況是最後一行的點無法被完全訪問,此時是求最後一行的無法被訪問的點的個數,另一種情況是最後一行的點可以被完全覆蓋,而此時就換做求在第一行選擇擴充套件點的最小個數。

題析:其實我並不是今天才遇到這道題,剛碰到這道題時,我猶豫了許久,但最後還是沒敢去碰。但實際上,這道題雖說初次做是有一點困難(dalao勿噴!),但在搞懂了這道題的實際做法時,你又會恍然大悟,它其實並不如你想象中的那麼複雜(就如一牛說言:這道題即沒用高階的結構又沒用高階的演算法,何談複雜)。

引入的話還是不寫了,既然這道題看起來有點雜亂,那我們就要用劃分子問題(

?)的方法,一步步搞倒這道題。那就按題目說要求的來做,首先,我們需要考慮如何去求最後一行點的問題。而對於求乙個點是否可以被訪問的一系列問題,我們想到的,最簡單的演算法,那就是搜尋,所以我們為何不可以乾脆將第一行的點的水閘全部放開,讓它們自由地輸水,而我們只需要列舉一遍最後一行的訪問情況,直接下定論就可以了,此處最多的搜尋情況為500*500=25000,以bfs+判重陣列即可輕鬆搞定,也不知是不是就是網上所說的灌水法

還剩下乙個求最小用點的問題,對於這個問題,我就不能提太多了,網上一般的解法是把第一行的每個點在最後一行能覆蓋的區間

(注意,此處的覆蓋點為什麼呈乙個連續區間,需要一定證明)看做乙個線段,緊接著就是線段覆蓋問題

來證明區間問題:文庫1

解題報告,最後用了比較常規的方式證明了區間問題,清晰易懂:文庫2

此題所聯絡的線段覆蓋問題,以及其它線段覆蓋系列的問題,沒看過的同學可以看一下,這一類問題還是別具特色的,這裡丟了乙個部落格,當然也可以自己另外再發掘:線段覆蓋

當然還有各類大牛的部落格值得一看,在此不再一一枚舉。

**:最後貼上醜陋的**,請多各牛多多包涵~

#include#include#include#include#include#define inf 0x3f3f3f3f

using namespace std;

const int n=500+5;

struct line

};struct point;

// 行列擴充套件陣列

int dh[5]=;

int dl[5]=;

// 題目資料

int n,m;

int het[n][n];

// line a[n]; // 記錄第一行每個點在最後一行的覆蓋區間(線段)

bool vis[n][n]; // 訪問記錄陣列

queueq; // bfs佇列

//void bfs(){

while( !q.empty() ){

point point=q.front();

q.pop(); // 取點

int h=point.h,l=point.l; // 用h,l簡化表示

for(int i=1;i<=4;i++)

if ( h+dh[i]<=n && h+dh[i]>=0 && l+dl[i]<=m && l+dl[i]>=0 && het[h+dh[i]][l+dl[i]]>n>>m;

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

cin>>het[i][j]; // 讀入資料

int wans=judge(); // 記錄最後一行不可能被訪問點個數

if ( wans==0 ){ // 都可以被訪問,即不存在不可能被訪問的點

int ans=work(); // 尋找訪問最優解

cout<<"1"<<"\n"<

抬頭一看時間居然是

2:33,果然寫部落格實在是給力啊。

一月已經過去~

2017.2.1

Codevs P1066 引水入城 BFS 貪心

題目描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水...

NOIP2010 引水入城

兩遍bfs floodfill,第一遍bfs可以判斷出最後是輸出0還是輸出1,第二遍bfs floodfill不懂 program flow const dx array 1.4 of 1.1 1,0,1,0 dy array 1.4 of 1.1 0,1,0,1 type atp record x...

VIJOS P1777引水入城

描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n行m列的矩形,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利...