2013 ACM ICPC 南京網路賽F題

2021-09-06 12:08:48 字數 1080 閱讀 5110

題意:給出乙個4×4的點陣,連線相鄰點可以構成乙個九宮格,每個小格邊長為1。從沒有邊的點陣開始,兩人輪流向點陣中加邊,如果加入的邊構成了新的邊長為1的小正方形,則加邊的人得分。構成幾個得幾分,最終完成九宮格時,誰的分高誰贏。現在給出兩人前若干步的操作,問接下來兩人都採取最優策略的情況下,誰贏。

分析:博弈搜尋,有人說要加記憶化,我沒有加也過了……與赤裸裸的博弈搜尋的區別在於對於最終狀態,並不是誰無路可走誰輸,而是誰分低誰輸。注意判斷分數相等的情況。在搜尋中每個節點要麼是必勝態,要麼是必敗態,可參見這裡對np問題的描述:

邊的儲存與判斷不好處理,我是使用了edge_row[ ][ ]陣列來儲存橫向邊,edge_col[ ][ ]來儲存縱向邊。並用其左邊(橫向)或上邊(縱向)的點來代表這條邊。

#include #include 

#include

using

namespace

std;

struct

point

point(

int x, int

y):x(x), y(y)

{}};bool edge_row[5][5

];bool edge_col[5][5

];bool

tom_turn;

intedge_num;

inttom_score, jerry_score;

point get_point(

inta)

void add_edge(point a, point b, bool

value)

intsquare(point a)

intget_score(point a, point b)

void

input()

}bool dfs(int next_score, int previous_score, bool

tom_turn)

if (!edge_col[j][i])}}

if (!did)

return

false;}

intmain()

return0;

}

view code

2013 ACM ICPC 長春網路賽F題

題意 兩個人輪流說數字,第乙個人可以說區間 1 k 中的乙個,之後每次每人都可以說乙個比前乙個人所說數字大一點的數字,相鄰兩次數字只差在區間 1 k 誰先 n,誰輸。問最後是第乙個人贏還是第二個人贏。第乙個人搶到n 1的方法,就是先說乙個數字與n 1的差是k 1的整數倍。因為在這之後另乙個人無論說幾...

2013 ACM ICPC 長沙網路賽J題

題意 乙個數列,給出這個數列中的某些位置的數,給出所有相鄰的三個數字的和,數列頭和尾處給出相鄰兩個數字的和。有若干次詢問,每次問某一位置的數字的最大值。分析 設數列為a1 an。首先通過相鄰三個數字的和我們可以求出a3,a6,a9 是多少。a3 sum a1,a2,a3 sum a1,a2 a6 s...

2013ACM ICPC亞洲區南京站現場賽G題

題目大意 乙個n維的系統中隨機選乙個向量 x1,x2,x3,xn 其中0 xi r,且x1 2 x2 2 x3 2 xn 2 r 2。現在給定n,r。求xi的期望。其實是一道很簡單的數學題。首先證明 對於 x1,x2,x3,xn 其中0 xi r,且x1 2 x2 2 x3 2 xn 2 r 2 x...