LOJ6212(博弈论)

n <= L 和 n <= 2L 情况显然,一次就能取完;

分析 n > 2L 时:

Alice手速太快,Bob同学是弱势群体,所以Bob肯定不能单纯地模仿Alice,那样顶多是平手(n要是无限他俩还真就平手了)。那么他的反超策略就是:先跟着Alice,然后关键时机(瓜快没了,马上就能结束战斗)比Alice少拿一个,最后留出一分钟空闲再狠狠抓一把;

但是Alice不傻的,她不能给Bob反超的机会,所以在即将到达2L这个决胜负边界时她是要注意好分寸的,由于Bob之前一直学着她拿,一旦这次她拿多了(>1个)导致n < 2L,那Bob就可以使出“悄咪咪模仿到比Alice少1时怒抓L个”之术,这之后留给Alice的就不到L个了,Alice就败了。

鉴于二位都是明白人,所以不失一般性地,在n > 2L这段时间,不妨理解为他们的博弈就是你摸一我摸一的疯狂试探。

然后我们会发现一直拿到n == 2L时:开局时的n如果是偶数,那他们都是平手的,然后一人一大把,平局了,Alice总共吃瓜n/2个;开局时的n如果是奇数,Alice此时多拿一个,然后一人一大把结束战斗。这种情况Bob也没办法的,Alice手速快,还每次只拿一个,Bob就算多拿,Alice也能秒速跟上然后反手超过。

最后ans为Alice的吃瓜数就是ceil(n/2)了。

 1 #include <cstdio>
 2 #define ll long long
 3 #define R(x) scanf("%lld", &x)
 4 #define W(x) printf("%lld
", x)
 5 
 6 int main() {
 7     ll T, n, l;
 8     R(T);
 9     while (T--) {
10         R(n), R(l);
11         if (n <= l)
12             W(n);
13         else if (n <= 2 * l)
14             W(l);
15         else
16             W((n + 1) / 2);
17     }
18     return 0;
19 }
原文地址:https://www.cnblogs.com/AlphaWA/p/10211924.html