R和D輪着投票,每一次每個人可以選擇一個對方的人讓他沒有投票權,都選最優策略的時候誰能勝利
稍微思考可以發現:
RD R win
DR D win
也就是說下標小的時候佔優勢
我開始以爲誰多誰就勝利,其實不是的,比如
DDRRR,這個是時候Dwin,因爲第一輪過後 會變爲什麼呢?
DDR?其實不是的,可以這樣決策,第一個D和第二個D分別讓第三個R和第四個R失去權力,然後最後一個R讓第一個D失去權力
就變爲了DR
接下來就是D win
因此我們有一個想法:分別把D和R的下標放入隊列裏,每次pop出一個比較他們的下標,小的下標可以讓大的失去權力,然後進入下一輪比較,同時呢,隊列較多的那個元素的其實要保存的下來的,他們是可以讓之前存活下的(也就是讓別人失去權力的那些)那些失去權力的,他們的下標應該是比較小的。
我們在實現的時候通過一個巧妙的 +n 來實現這一點。
代碼實現:
public String predictPartyVictory(String senate) {
Queue<Integer> d = new ArrayDeque<>();
Queue<Integer> r = new ArrayDeque<>();
int n = senate.length();
for (int i = 0; i < n; i++) {
if (senate.charAt(i) == 'D') d.add(i);
else r.add(i);
}
while (!d.isEmpty() && !r.isEmpty()) {
while (!d.isEmpty() && !r.isEmpty()) {
int dpoll = d.poll();
int rpoll = r.poll();
if (dpoll < rpoll) d.add(dpoll + n);
else r.add(rpoll + n);
}
}
return d.isEmpty() ? "Radiant" : "Dire";
}