1. 程式人生 > >HDU 2897 邂逅明下 ( bash 博弈變形

HDU 2897 邂逅明下 ( bash 博弈變形

span 博弈 void hdu 第一次 ack [] clas mar

HDU 2897 邂逅明下 ( bash 博弈變形

題目大意

有三個數字n,p,q,表示一堆硬幣一共有n枚,從這個硬幣堆裏取硬幣,一次最少取p枚,最多q枚,如果剩下少於p枚就要一次取完。兩人輪流取,直到堆裏的硬幣取完,最後一次取硬幣的算輸。

解題思路

  • 若 n == k * (p + q), 則 A 必勝 第一次 A 取 p 個, 之後每次 B 取 x 個時, A 取 (p + q - x) 個, 則最後當 B 面對有 p 個硬幣的時候, 必輸.
  • 若 n == k * (p + q) + left, left <= p, 則 B必勝 , 若 A 取 x 個, 則 B 取 (p + q - x) 個, 則最後 A 會面對 有 left (left <= p) 的情況, p 必輸.
  • 若 n == k * (p + q) + left, left > p, 則 A必勝 , 第一輪 A 取 t (1 < left - t < p) 個, 之後每次 B 取 x 個時, A 取 (p + q - x) 個, 則最後當 B 面對有 t (1 < left - t < p) 個硬幣的時候, 必輸.

代碼

package 博弈;

import java.util.Scanner;

public class HDU2897 {

    public static void main(String[] args) {
        Scanner in = new
Scanner(System.in); while(in.hasNext()) { int n = in.nextInt(); int p = in.nextInt(); int q = in.nextInt(); if(n % (p + q) == 0) System.out.println("WIN"); else { int left = n % (p + q); if
(left <= p) System.out.println("LOST"); else if(left > p) System.out.println("WIN"); } } } }

HDU 2897 邂逅明下 ( bash 博弈變形