P1432 倒水問題 普及 提高(好好理解!)

2021-10-08 14:04:49 字數 3864 閱讀 6288

題意:就是有倆被子容量a b,讓你想辦法讓b裡面裝n些水。然後有六種操作

輸出次數和過程。

思路:剛開始我以為就觀察a n的關係來寫就行了,唉寫了半天40分

錯誤**:

/*35

4n>

a把b倒滿

然後不斷地進行b倒給a,

滿了把a倒空,然後再來重複,知道a

b其中乙個等於n

用了六步

1.把b倒滿。a=

0,b=

5,2.b倒給a。a=

3,b=

2;3.把a倒空a=

0,b=

2;4.b倒給aa=

2,b=

05.倒滿ba=2

b=5;

6.b倒給aa=

3b=4

;*//

*573

a>

n把a倒滿

然後不斷地進行a倒給b,滿了把b倒空,

然後再來重複,知道a

b其中乙個等於n用了6

步1.把a倒滿a=

5b=7

2.把a倒給ba=

0b=5

3.把a倒滿a=

5,b=

5;4.把a倒給ba=

3,b=

7;5.把b倒空a=

3,b=

06.把a倒給ba=

0,b=

3;*/

#include

<

iostream

>

#include

<

cstdio

>

#include

<

cmath

>

#include

<

string

>

#include

<

cstring

>

#include

<

stack

>

#include

<

algorithm

>

#include

<

iomanip

>

#include

<

map>

#include

<

queue

>

#include

<

vector

>

#include

<

set>

const

intinf

=0x3f3f3f3f;/

/1061109567

typedef

long

longll;

using

namespace

std;

intv

[100000];

voidf(

inta

,intb,

intn

)elseif(

aa==n

||bb=

=n)break;if

(bb==

0)if(

aa==a

)}}elseif(

nelseif(

aa==n

||bb=

=n)break;if

(aa==

0)if(

bb==b

)}}if

(aa==

n)cout

<

<

s<

<

" ";

for(

inti=1

;i<=s

;i++

)cout

<

i]<

<

" ";

cout

<

<

endl;}

intmain()

elseif(

b==n

)f(a

,b,n

);}}

正確思路:用dfs來做!!!!

設立陣列

int x[6][3] =

,//x[0][0] x[0][1] x[0][2]

,//x[1][0] x[1][1] x[1][2]

,//x[2][0] x[2][1] x[2][2],,

};vis表示狀態 now陣列表示當前步 ,best 表示好的方案步.

用dfs搜尋。

#include

<

iostream

>

#include

<

cstdio

>

#include

<

cmath

>

#include

<

string

>

#include

<

cstring

>

#include

<

stack

>

#include

<

algorithm

>

#include

<

iomanip

>

#include

<

map>

#include

<

queue

>

#include

<

vector

>

#include

<

set>

const

intinf

=0x3f3f3f3f;/

/1061109567

typedef

long

longll;

using

namespace

std;

inta,b

,n;bool

vis[

3010][

3010];

intnow

[100010],

best

[100010],

k;void

dfs(

inta

,intb,

intc

)int

tmp1

,tmp2;if

(a+b

>a)

tmp1=a

;else

tmp1=a

+b;if

(a+b

>b)

tmp2=b

;else

tmp2=a

+b;intx[

6][3

]=,/

/x[0

][0]

x[0]

[1]x

[0][

2],/

/x[1

][0]

x[1]

[1]x

[1][

2],/

/x[2

][0]

x[2]

[1]x

[2][

2],,

};vis[a]

[b] =

1;for(

inti=0

;i<6;

i++)

}vis[a

][b]

=0;}

intmain()

}

洛谷 P1432 倒水問題

戳 bfs 第一遍提交 50 第二遍就 100 了,qwq include include include include includeusing namespace std int t,ca,cb,n,step,sum int a now 100001 b now 100001 flag 100...

P1582 倒水(思維)

思路 首先如果乙個數等於2的n次方,那麼合併後一定是1個瓶子。而2的n次方中1的個數也是1個,13的二進位制1 1 0 1,二進位制1的個數3個,剛好13合併後是3個瓶子。我們可以得到乙個數二進位制1的個數就是這個數合併後的瓶子個數。我們在學樹狀陣列時有乙個lowbit函式 x x 就是取最後一位1...

P1582 倒水 題解

來水一發水題。題目鏈結。正解開始 首先,我們根據題意,可以得知這是乙個有關二進位制的題目 具體什麼關係,怎麼做,我們來具體分析 對於每個n,我們嘗試將其二進位制分解,也就是100101之類的形式 根據瓶子合併的特性,我們可以判定最後每乙個瓶子內的水都可以表示成2 i的形式 感性理解 對於每乙個數字上...