題意:給定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 狀態轉移我就想 每一次倒水一定要把乙個倒完或把另乙個裝滿才有意義,因為只有這樣三個瓶的水量才知道 所以可以根據這個進行狀態轉移...