UVa 10603 Fill (BFS 優先佇列)

2022-09-13 05:18:11 字數 989 閱讀 8331

題意:給定4個數,a,b,c,d,分別代表空杯子容積為a,b,乙個盛滿水的杯子容積為c,讓你不斷倒水,找乙個dd,是不是存在某個時刻,某個杯子裡的水dd,和d相同,或者無限接近。讓求最少的倒水量和dd(可能和d相同)。

解析:用bfs列舉所有的狀態,就是把i裡面的水倒到j裡面,在這裡學到了用node的優先佇列,內部書寫也是要記一記.其他**裡面會有注釋.

#include

#define ll long long

#define inf 0x3f3f3f3f

#define pb push_back

#define rep(i,a,b) for(int i=a;i#define rep1(i,b,a) for(int i=b;i>=a;i--)

using

namespace

std;

const

int maxn = 200 + 5;

struct node

};int vis[maxn][maxn], ans[maxn];

void update(const node &u)

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

;//容量大小

priority_queueq;//優先佇列

memset(vis, 0, sizeof(vis));

memset(ans, -1, sizeof(ans));

node u;

u.val[0] = 0; u.val[1] = 0;//開始的狀態

u.val[2] = c; u.d = 0;

q.push(u);

vis[0][0] = 1;//前兩種容器即可查重

while(!q.empty())

}while(d >= 0)

--d;//找最近的

}}int main()

return

0;}

Fill BFS 優先佇列 UVA10603

uva 10603 include include include using namespace std struct node friend bool operator node a,node b int a,b,c,d int vis 205 205 b杯和c杯的容量表示一種狀態 int re...

uva10603 解題報告

uva10603 fill 倒水問題 解題報告 題目大意 設3個杯子的容量為abc,起初只有第三個杯子裝滿了c公升水。其它兩個杯子均為空。最少要倒多少公升水可以讓某乙個杯子裡有d公升水。如果無法做到d公升水。就讓某個杯子裡有d 公升水,其中d 分析 這個樣子其實有一點點動態規劃的味道,其實不是。一看...

uva 10603 倒水問題

劉汝佳說這是一道最短路,可是我怎麼也想不出如何建圖,把問題轉換為最短路問題,我就想自己的辦法。感覺這個題可以用三維dp 每一維代表乙個瓶子 f maxn maxn maxn 狀態轉移我就想 每一次倒水一定要把乙個倒完或把另乙個裝滿才有意義,因為只有這樣三個瓶的水量才知道 所以可以根據這個進行狀態轉移...