题意:

有一块xi*Yi的矩形巧克力,Alice只允许垂直分割巧克力,Bob只允许水平分割巧克力。具体来说,对于Alice,一块巧克力X i * Y i,只能分解成a * Y i和b * Y i其中a + b = X i和a, b > 0。对于Bob,一块巧克力X i * Y i,只能分解成X i * a和X i * b其中a + b = Y i和a ,b > 0。(每次切割只能以整数单位来切,例如一个宽为3的巧克力,你垂直切只能切成一个1,2而不能切成两个1.5)

谁最后不能操作了,谁就输了

题解:

根据题意我们只需要找到在给出的巧克力中他们两个人能走的最大步数,然后对比一下就可以了;但是另一个人的步数是和前一个人个操作有关

例如一个4*4的巧克力,如果每一次Alice都以1来切割(第一次1 3,第二次1 1 2,第三次1 1 1 1),这样的话Bob每一次切割宽为1的巧克力的话,他一共能走3*4=12步。但是如果每次Alice按照总宽度的一半来切割的话,那么Alice还是走4步(先切成2 2,然后再找每一个2来切),但是Bob就只能走2步

而且Alice肯定想让Bob走最小步数,因为Bob步数越大Alice就越难赢,所以每次Alice按照总宽度一半来切就是最优了

代码:

 1 //参考:https://blog.csdn.net/qq_34374664/article/details/52959986
2 #include <iostream>
3
4 #include <cstdio>
5
6 #include <cstring>
7
8 #include <algorithm>
9
10 using namespace std;
11
12 const int maxn = 1e9 + 7;
13
14 int main()
15
16 {
17
18 int x, y, n, t, Case = 0;
19
20 scanf("%d", &t);
21
22 while(t--)
23
24 {
25
26 long long ansx = 0, ansy = 0;
27
28 scanf("%d", &n);
29
30 for(int i = 1; i <= n; i++)
31
32 {
33
34 scanf("%d%d", &x, &y);
35
36 while(x > 1 && y > 1)
37
38 {
39
40 x /= 2;
41
42 y /= 2;
43
44 ansx++;
45
46 ansy++;
47
48 }
49
50 if(x == 1) ansy += y - 1;
51
52 if(y == 1) ansx += x - 1;
53
54 }
55
56 if(ansx <= ansy) printf("Case %d: Bob\n", ++Case);
57
58 else printf("Case %d: Alice\n", ++Case);
59
60
61
62 }
63
64
65
66
67
68 return 0;
69
70 }

POJ 2960 S-Nim题意:

给你n堆石子,你每次只能取一定数量的石子,这个一定数量每个样例第一行就会输入;谁最后不能取石子谁就输了

题解:

很明显的SG函数,把第一个样例讲一下

2 2 5   //第一个数是k,后面输入k个数,每个数就是限制你每次只能取多少石子
3         //下面有多少行询问
2 5 12      //第一个数就是有多少堆石子,后面就是每一堆石子的数量
3 2 4 7
4 2 3 7 12

对于5 12 这两堆石子我们可以向尼姆博弈一样先处理一堆石子,之后再让它们相互异或

SG(0)=0   //初始化

SG(1)=0

SG(2)=mex{SG(0)}=1

SG(3)=mex{SG(1)}=1

SG(4)=mex{SG(2)}=0

SG(5)=mex{SG(0),SG(3)}=2

SG(6)=mex{SG(1),SG(4)}=1

SG(7)=mex{SG(2),SG(5)}=0

SG(8)=mex{SG(6),SG(3)}=0

SG(9)=mex{SG(7),SG(4)}=1

SG(10)=mex{SG(8),SG(5)}=1

SG(11)=mex{SG(9),SG(6)}=0

SG(12)=mex{SG(10),SG(7)}=2

所以两堆石子的结果就是SG(5)^SG(12)=0,所以这个时候就输了

那么肯定是每一组样例先打表对SG函数预处理

代码:

 1 #include <iostream>
2 #include <cstdio>
3 #include <cmath>
4 #include <cstring>
5 #include <algorithm>
6 using namespace std;
7 #pragma comment(linker, "/STACK:102400000,102400000")
8 #define ls i<<1
9 #define rs ls | 1
10 #define mid ((ll+rr)>>1)
11 #define pii pair<int,int>
12 #define MP make_pair
13 typedef long long LL;
14 const long long INF = 1e18+1LL;
15 const double Pi = acos(-1.0);
16 const int N = 5e5+10, M = 2e5+20, mod = 1e9+7, inf = 2e9;
17
18 int k,sg[N],s[N],vis[N];
19 char A[N];
20 int main() {
21 while(scanf("%d",&k)!=EOF) {
22 if(k == 0) break;
23 for(int i = 1; i <= k; ++i) scanf("%d",&s[i]);
24 sg[0] = 0;
25 for(int i = 1; i <= 10000; ++i) { //预处理打表找出SG的值
26 for(int j = 0; j <= 100; ++j) vis[j] = 0;
27 for(int j = 1; j <= k; ++j) {
28 if(i >= s[j] && sg[i - s[j]] <= 100) vis[sg[i - s[j]]] = 1; //这一步就是判断从这个点都能到哪
29 }
30 for(int j = 0; j <= 100; ++j) { //这一步相当于找不在mex中最小的值
31 if(!vis[j]) {
32 sg[i] = j;
33 break;
34 }
35 }
36 }
37 int q,cnt = 0;
38 scanf("%d",&q);
39 while(q--) {
40 int x,y,ans = 0;
41 scanf("%d",&x);
42 while(x--) {
43 scanf("%d",&y);
44 ans ^= sg[y]; //得到每一堆石子的SG值之后再异或处理就可以了
45 }
46 if(ans) printf("W");
47 else printf("L");
48 }
49 printf("\n");
50 }
51 return 0;
52 }

HDU3544 Alice's Game && POJ 2960 S-Nim(SG函数)的更多相关文章

  1. POJ 2960 S-Nim 博弈论 sg函数

    http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...

  2. poj 2960 S-Nim(SG函数)

    S-Nim Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3694   Accepted: 1936 Description ...

  3. poj 2960 S-Nim【SG函数】

    预处理出SG函数,然后像普通nim一样做即可 #include<iostream> #include<cstdio> using namespace std; const in ...

  4. hdu 3032 Nim or not Nim? sg函数 难度:0

    Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. S-Nim POJ - 2960 Nim + SG函数

    Code: #include<cstdio> #include<algorithm> #include<string> #include<cstring> ...

  6. poj 2960 S-Nim (SG)

    题意: K个数,s1...sk. m个状态,对于某一个状态,有L堆石子,每人每次取的石子个数只能是s1...sk的一个,且只能在一堆中取. 输出m个状态是先手胜还是先手败,先手胜输出W,否则输出L. ...

  7. HDU 3032 Nim or not Nim (sg函数)

    加强版的NIM游戏,多了一个操作,可以将一堆石子分成两堆非空的. 数据范围太大,打出sg表后找规律. # include <cstdio> # include <cstring> ...

  8. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  9. HDU 3032 Nim or not Nim?(sg函数)

    题目链接 暴力出来,竟然眼花了以为sg(i) = i啊....看表要认真啊!!! #include <cstdio> #include <cstring> #include & ...

随机推荐

  1. PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS

    题目分析: 可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合 ...

  2. ssl证书与java keytool工具

    ssl协议 SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安 ...

  3. 怎么判断是旧版本的ext3还是新版本?

    怎么判断是旧版本的ext3还是新版本的?   ---高性能419

  4. 【Linux】ps -ef 和ps aux 的区别

    Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux.这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格,System V风格和BSD 风格, ...

  5. ctfshow—web—web签到题

    打开靶机,发现只有一句话 查看源码 发现一段字符串,猜是base64加密 拿到flag

  6. Docker 如何动态修改容器端口映射

    Docker端口映射往往是Docker Run命令时通过-p将容器内部端口映射到宿主机的指定端口上,一般来说容器的端口所对应的端口是提前确定需要映射的.但是有些情况下不得不需要临时映射端口,例如Doc ...

  7. CSS实现迷你键盘

    最近做了一个迷你键盘的dome,这里分享给大家 dome下载地址(点击下载) 代码如下: <!DOCTYPE html> <html lang="en" > ...

  8. Flink的状态与容错

    本文主要运行到Flink以下内容 检查点机制(CheckPoint) 状态管理器(StateBackend) 状态周期(StateTtlConfig) 关系 首先要将state和checkpoint概 ...

  9. 数据湖-Apache Hudi

    Hudi特性 数据湖处理非结构化数据.日志数据.结构化数据 支持较快upsert/delete, 可插入索引 Table Schema 小文件管理Compaction ACID语义保证,多版本保证 并 ...

  10. Python程序中首行#!/usr/bin/env python的作用

    1.通常我们在pycharm中写程序的时候会在首行写上#!/usr/bin/env python 如: #!/usr/bin/env python3#-*-coding: UTF-8 -*-#Auth ...