例題7 8 UVA 10603 Fill 倒水問題

2021-07-10 06:47:08 字數 1345 閱讀 5683

2017.1.24

重新做了一遍這個題目。

三個杯子,總水量是一樣的,只需要記錄前兩個杯子來作為狀態來判重即可。

然後他要求總到水量最小,直接貪心就好了,優先選取總水量最小的,用優先佇列即可。

然後找乙個最接近d的答案即可。

#include #include #include #include using namespace std;

struct node

bool operator < (const node& rhs) const

}st;

priority_queueq;

bool vis[207][207];

int all;

int ans1,ans2;

int a,b,c,d;

int va[5];

void bfs()}}

for (int i = 0; i < 3; ++i)

else

if (!vis[ne.v[0]][ne.v[1]])}}

}}

}int main()

return 0;

}

完全仿照紫書上來寫的!

書中大體思路是:

用ans來記錄答案,不斷取最小值來更新!

用vis來表示是否訪問過,之所以是二維陣列,是因為總水量是固定的,兩個杯子確定,第三個杯子自然也就確定,兩個狀態足矣!

用結構體表示每乙個狀態!其中包括每個杯子的水量!u.wat,還有dist 為到目前這個狀態總的取水量!

然後用優先佇列不斷倒水,

有乙個技巧,**中先算出需要倒的水量,然後再計算!這樣結果不會出現負值,兩個情況都考慮到了!很巧妙!

int m = min(cup[j],u.wat[i]+u.wat[j]) - u.wat[j];//m 為需要倒水的量,這樣寫 不會出現負值!

最後注意結果可能會有0就行了!

#includeusing namespace std;

struct node

};const int maxn = 200 + 10;

int cup[3],vis[maxn][maxn],ans[maxn];//vis之所以是二維陣列,是因為總水量是固定的,兩個杯子確定,第三個杯子自然也就確定,兩個狀態足矣!

void update_ans(const node &u)

}void solve(int a,int b,int c,int d)}}

while(d >= 0)

--d;

}}int main()

return 0;

}

例題 油田(UVa 572)

輸入乙個m行n列的字元矩陣,統計字元 組成多少個八連塊。如果兩個字元 所在的格仔相鄰 橫豎或者對角線方向 就說他們屬於同乙個八連塊。sample input 1 1 3 5 sample output01 分析 dfs基礎題,典型題。用dfs找聯通塊 從每個 格仔出發,遞迴遍歷它周圍的 格仔。每次訪...

UVa156Map入門例題

include include include include includeusing namespace std vectorwords mapcnt string repe const string s for int i 0 i1.輸入的字串將其先進行標準轉換後存放在map中 a.轉換成小寫...

凸包例題 UVa 10652

題意 有n塊矩形木板,你的任務是用乙個面積盡量小的凸多邊形把它們包起來,並計算出木板佔整個包裝面積的百分比。第一行輸入的是資料的組數,t 50 每組資料第一行為木板個數,n 600 以下n行每行五個實數,x,y,w,h,j。j是順時針旋轉的角度。sample input 4 7.5 6 3 0 8 ...