noip模擬賽 蒜頭君救人

2022-05-01 09:30:10 字數 2610 閱讀 8240

分析:之前的一道模擬賽題是dp+dfs,這道題是dp+bfs.

我們設f[stu][i][j]為當前狀態為stu,走到(i,j)的答案,考慮怎麼設計stu,每個人的狀態有3種:要麼在原地,要麼被揹著,要麼已經到了終點,那麼用乙個3進製數儲存就可以了.

下面考慮怎麼轉移,直接遞推肯定是不對的,dfs也不行,只能bfs了.我們每次可以選擇不走,或者如果當前點有人就背起來,或者到了終點就放下所有人或者放下所有使速度變慢的人,寫好幾次轉移就過了.

#include #include 

#include

#include

#include

using

namespace

std;

const

int inf = 0x7ffffff

;int n, m, k, top, sx, sy, tx, ty, a[20][20], speed[30], f[60010][15][15], dx = , dy = ,flag[20

];char name[30][3],s[20][20

];struct

node

;int jisuan(int

stu)

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

if (flag[i] == 1

) sped +=speed[i];

if (sped < 1

) sped = 1

;

return

sped;

}bool judge(int x, int

y)int bei(int stu, int x, int

y) memset(flag,

0, sizeof

(flag));

while

(stu)

if(flag[cur])

return0;

flag[cur] = 1

;

for (int i = top; i >= 1; i--)

stu = stu * 3 +flag[i];

return

stu;

}int fang1(int stu, int x, int

y)

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

if (flag[i] == 1

) flag[i] = 2

;

for (int i = top; i >= 1; i--)

stu = stu * 3 +flag[i];

return

stu;

}int fang2(int stu, int x, int

y)

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

if (flag[i] == 1 && speed[i] > 0

) flag[i] = 2

;

for (int i = top; i >= 1; i--)

stu = stu * 3 +flag[i];

return

stu;

}int qpow(int a, int

b)

return

res;

}void

bfs()

//揹人

if (s[nx][ny] >= '

a' && s[nx][ny] <= 'z'

)

}//放人

if (s[nx][ny] == 't'

)

if (f[stu2][nx][ny] > f[u.zhuangtai][x][y] +sudu)}}

}}}int

main()

else

else}}

}for (int i = 1; i <= top; i++)

scanf(

"%s%d

", name[i], &speed[i]);

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

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

for (int l = 1; l <= 10; l++)

f[i][j][l] =inf;

f[0][sx][sy] = 0

; bfs();

printf(

"%d\n

", f[qpow(3, top) - 1

][tx][ty]);

return0;

}

蒜頭君救人

問題 蒜頭君是乙個樂於助人的好孩子,這天他所在的鄉村發生了洪水,有多名村民被困於孤島上,於是蒜頭君決定去揹他們離開困境,假設蒜頭君所在的村子是 n mn m 的網格,網格中.號代表平地,號代表該地已被洪水淹沒,a b 等大寫字母表示該地有村民被困,s代表蒜頭君的起點,t代表蒜頭君的終點。蒜頭君的初始...

noip模擬賽 蒜頭君的兔子

分析 直接暴力算有30分,像斐波那契那樣推式子算有60分,如果想要得到100分就要用一種數列題的常見優化 矩陣了.當前的兔子數和十年內的兔子數有關,我們需要1個1 11的矩陣,來記錄當前為0歲 1歲 2歲.兔子的數量,同時還需要乙個快速冪矩陣進行計算.由於一年後a 1 a 0 a 2 a 1 a 1...

noip模擬賽 蒜頭君的樹

分析 這道題問的是樹上整體的答案,當然要從整體上去考慮.一條邊對答案的貢獻是這條邊一端連線的點的個數 另一端連線的點的個數 邊權,可以用一次dfs來統計答案,之後每次更改操作在原答案的基礎上增減就好了.千萬不要傻傻地去求lca.事實證明只有10分.問的是任意兩點最短距離之和,樹上兩個點的最短路徑只有...