【题解】一本通例题 S-Nim】的更多相关文章

一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化过程就像将搜索树上没用的枝条剪下来,因此搜索的优化过程又叫剪枝.剪枝的实质就是通过判断决定是否要沿当前枝条走下去. 二.搜索的剪枝必需遵循三个原则: 1.正确性(不能把正解排除,要不然搜什么呢?)2.准确性(尽可能把不能通向正解的枝条剪去)3.高效性(因为在每个枝条上都要进行一次判断,如果判断的复杂…
\(\color{purple}{Link}\) \(\text{Solution:}\) 这个题就是给\(Nim\)游戏做了一个限制. 考虑一下\(\text{SG}\)函数:给定的局面下对应的\(SG\)函数值,若\(=0\)则必败. 又有:许多子游戏组成的一个游戏的\(SG=\text{xor}_{i=1}^n SG_i.\) 那么对于这个题,第一次的想法是对于每一个子游戏求一下是不是必胜.这显然是一个对\(SG\)函数了解不足的问题. 那么考虑一下如何求\(SG\)函数: \(SG(0)…
题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可行性剪枝考虑/找限制.上下界: 1.考虑当前:当前体积v一定小于总体积N:第i层的半径和高度一定比上一层小(从下往上数层数),同时每次层的高度和半径都>=1(都是正整数). 2.更近一步,考虑未来:预处理出蛋糕制作到第i层之后再制作的蛋糕体积最小的情况,如果当前体积+这种情况>N,显然不能做成蛋糕…
A Simple Nim 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5795 Description Two players take turns picking candies from n heaps,the player who picks the last one will win the game.On each turn they can pick any number of candies which come from the…
题解:简单的NIM游戏,直接计算SG函数,至于找先手策略则按字典序异或掉,去除石子后再异或判断,若可行则直接输出. #include <cstdio> const int N=1005; int SG[N],b[N],hash[N],a[N],sum,tmp,i,j,n,m; void FSG(int s){ SG[0]=0; for(int i=1;i<=s;i++){ for(int j=1;b[j]<=i&&j<=m;j++)hash[SG[i-b[j]…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle  Accepts: 42  Submissions: 269  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格…
题面 题面 题解 首先我们知道nim游戏先手必败当且仅当所有石堆异或和为0,因此我们的目标就是要使对手拿石堆的时候,无论如何都不能使剩下的石堆异或和为0. 对于一个局面,如果我们可以选取一些可以凑出0的石堆留下(因为不能全部拿走,所以这里至少要拿一堆),那么显然就先手必败了. 因此作为先手,我们留给后手的状态必须是一个凑不出0的状态. 考虑如果一个局面可以凑出0,会具有什么样的特征. 对于一个局面,我们求出它的线性基,如果在线性基外还有别的01串,那么根据线性基的定义,线性基内的串一定可以凑出外…
Be the Winner Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4939    Accepted Submission(s): 2724 Problem Description Let's consider m apples divided into n groups. Each group contains no more…
题目描述 Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下: 1. Claris和NanoApe两个人轮流拿石子,Claris先拿. 2. 每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜. 不同的初始局面,决定了最终的获胜者,有些局面下先拿的Claris会赢,其余的局面Claris会负. Claris很好奇,如果这n堆石子满足每堆石子的初始数量是不超过m的质数,而且他们都会按照最优策略玩游戏,那么NanoApe能获胜的局面有多少种. 由于答案可能…
DAY1 枚举 例题1 题解: 例题2 题解: 例题3 题解: vis[ ]判断是否为素数,pri[ ]储存素数 例题4 题解: 例题5 题解: PS: i  <  1<<n        i<2^n (1<<j)& i      如果2^j最后一位和 i 相同,返回1 例题6 判回文数是N√N,素数NlogN 枚举: 1.从起点开始向四个方向扩展 2.到一个点卡死,删除栈中的位置,回到前一步继续搜 3.找到一种解 4.这也是一个解 PS:DFS不会死循环,走完…
有些事情要明着写出来才会去干. 这里是一个不断更新的 ToDo-List,大致按照重要度和列出时间排序,已经完成的会画上删除线. 主要着眼短期计划,其中的大部分事务应该在一周内解决,争取不做一只鸽子. 完成洛谷P4705 P3321 P4389,深入理解生成函数(19-02-20) 补齐博客CF#1114,WC2019游记(19-02-20) 学习巩固圆方树相关知识(19-02-20) 做至少 5 4 题网络流相关的新题目(19-02-20) 通过 LibreOJ 按照 AC 人数排序的第一页部…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取时可以从有8个的那一堆取走7个剩下1个,也可以从有9个的中那一堆取走9个剩下0个,也可以从有10个的中那一堆取走7个剩下3个. Input输入有多组.每组第1行是m,m<=200000. 后面m个非零正整数.m=0退出. Output先取…
[算法]主席树 [题解]例题,记录和,数字出现超过一半就递归查找. 主席树见[算法]数据结构 #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespace std; int read() { ,t=; ; +c-';}while(isdigit(c=getchar())); return s*t; } ; ]; int n,m,sz,root[m…
一.Bash博弈 1.问题模型:只有一堆n个物品,两人轮流从这堆物品中取物,最多取m个,最后取光者胜. 2.解决思路:当n=m+1时,由于一次最多取m个,无论先取者拿走多少个,后取者都能一次拿走剩余的物品,后者取胜,所以当一方面对n%(m+1)==0的时候,其面临的是必败局势.所以当n==(n+1)*r+s(r为任意自然数,s<=m)时,如果先取者要拿走s个物品,后取者拿走x(x<=m)个物品,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜…
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi…
指针变量与应用——动态数组 在C++中,有一种神奇的变量,它不可以表示一个值,但是可以表示某个元素的地址,通过地址来访问这个元素. 打个比方:你有一张地图和一个坐标,你就可以通过访问这个坐标来达到你访问坐标所表示的元素的目的.指针变量就是这个“坐标”. 下面我们来具体看看指针变量的应用. 1.指针变量的性质 正如上面所说,指针变量不可以表示一个值,但是可以指向别的元素的地址,通过这个地址来间接访问这个元素的值. 由于它的性质,指针变量不可以直接=一个元素,赋值时要注意. 具体操作下面会讲到. 2…
书中代码有误.书中为sort(a+1,a+n+1,Cmp). // // Created by yuxi on 19-1-13. // /* * * <信息学竞赛一本通-提高版>全部AC解答及解释 * * 第一部分 基础算法 * 第一章 贪心算法 * 例题1 活动安排 * */ #include <iostream> #include <algorithm> #include <fstream> #include <string> using n…
又是一道剪枝剪了半天的搜索题...题目传送 要充分利用题目中的约束条件:1.:2.对于每个k(1≤k≤m)k(1≤k≤m)满足ak=ai+aj(0≤i,j≤k−1)ak=ai+aj(0≤i,j≤k−1),这里i与j可以相等.由此可以推出a1一定=2(也能减少很多操作次数了吧) 还是先找找搜索过程要面临的状态和有关维度:目标数n,答案序列的长度limit,序列中的每个数ai,当前序列中的最后一个数last. 由于如果不对序列长度加以限制,普通的深搜便会“一发不可收拾”,所以这里用迭代加深搜索. 可…
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按照右端点排序,每次贪心的从区间的最右边种,然后检查下一个区间是否缺少,缺的话就在最右边继续补. 3):「一本通 1.1 例 3」喷水装置:这题可以发现每个装置所能覆盖的区间是一个矩形,所以这题就变成了给了一堆线段,选出最少线段覆盖整个区间,按照右端点排序然后贪心就可以了. 4):「一本通 1.1 例…
[信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \(Answer\) - > $ \large 1001$ $ problem1002 $ \(Answer\) - > $ \large 1002$ $ problem1003 $ \(Answer\) - > $ \large 1003$ $ problem1004 $ \(Answer\…
662A,戳我戳我 Solution: 我们先取\(ans=a[1] \bigoplus a[2] \bigoplus ... \bigoplus a[n]\),然后我们定义\(c[i]=a[i] \bigoplus b[i]\),我们就可以知道每异或一个\(c[i]\),就是更换选取\(a[i],b[i]\),这里很好想. 然后我们要处理出\(c[i]\),中有多少子集异或和为\(ans\),这样异或出来总和为\(0\),这个我们就可以用线性基了. 然后后面求子集我还是没有太弄懂,看了题解也有…
思路:三维Nim积 代码: #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> typedef long l…
题意:在一个二维平面中,有n个灯亮着并告诉你坐标,每回合需要找到一个矩形,这个矩形xy坐标最大的那个角落的点必须是亮着的灯,然后我们把四个角落的灯状态反转,不能操作为败 思路:二维Nim积,看不懂啊,只能套模板了 参考:HDU 3404 Switch lights (NIM 积) 代码: #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #inc…
题意: 给一个矩阵,每一次一个玩家可以从任意一行中选任意数量的格子并从中拿石头(但最后总数要大于等于1),问你谁赢 思路: 一开始以为只能一行拿一个... 将每一行石子数相加就转化为经典的Nim博弈 代码: #include<cstdio> #include<iostream> #include<algorithm> const int N = 100000+5; const int INF = 0x3f3f3f3f; using namespace std; int…
例题:不要62 同步数位DP 需要统计区间[l,r]的满足题意的数的个数,这往往可以转换成求[0,r]-[0,l) 基本思想与方法 有了上述性质,我们就可以从高到低枚举第一次<n对应位是哪一位. 这样之前的位确定了,之后的位就不受n的限制即从00...0~99...9,可以先预处理,然后这时就可以直接统计答案. 预处理F数组. F[i,st] 代表 位数为i(可能允许前导0.如00058也是个5位数),状态为st的方案数.这里st根据题目需要确定. 如i=4,f[i,st]也就是0000~999…
题目传送 (其实有一个更正经的题解) 看了许久,发现这题貌似就是一个动态规划啊,但毕竟是贪心题库里的题,还是想想用贪心解吧. 经过(借鉴大佬思路)十分复杂的思考后,终于理解出了这题的贪心思路.该题的难点主要在最后可在任意湖边停住,而且不能往回走,在一个湖钓鱼时的效率还会越来越少.常规的思路看来是不行的了,题目好多动态未知的量,唯有我们更换角度,“化动为静”: 即然最后不知道停在哪个湖,那就分类讨论呗.把停在每个湖的最优解全部求出,在最后取个最优解不就行了吗?发现当我们知道主人公最后停在哪个湖后,…
栈的例题和总结 0. 目录 有效的括号 栈实现队列(这个参见队列) 1. 有效的括号 static int top = 0; static char* buf = NULL; void stack(int size){ top = size; buf = (char*)malloc(size+1); buf[size] = '\0'; } void push(char c) {buf[--top] = c; } char pop() {return buf[top++];} bool isVal…
队列的例题和总结 0. 目录 栈实现队列 队列实现栈 滑动窗口最大值 1. 栈实现队列 FIFO和FILO,相当于+-号,互转都是利用"负负得正"的原理. 官方解答中第二种思路很6,按需反转,这样摊还分析下来,复杂度变成了O(1) class MyQueue { private: stack<int> s1; stack<int> s2; public: /** Initialize your data structure here. */ MyQueue()…
链表的例题和总结 0. 目录 环形链表 1. 环形链表 题目: https://leetcode-cn.com/problems/linked-list-cycle/ 看了别人的思路真是感概万千,思路这个东西啊,哈哈哈 官方方法1: 哈希表 官方方法2: 快慢指针 奇葩方法1: 标记访问过的节点(会破坏链表) 奇葩方法2: 倒因为果法 1.1 哈希表 略 1.2 快慢指针 思路就是田径场的追击问题, 如果有环, 那么跑得快的一定会碰到跑的慢的. 跑得快的一次走两步, 跑得慢的走一步. fast=…
废话不多说,直接上题: 1585: [例 1]Amount of Degrees 时间限制: 1000 ms         内存限制: 524288 KB提交数: 130     通过数: 68 [题目描述] 原题来自:NEERC 2000 Central Subregional,题面详见 Ural 1057. 求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和.例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 1…