POJ刷题记录 - updating
刷题列表见:http://blog.csdn.net/functionendless/article/details/78196691
一:初期简单题:
一. 基础算法(枚举,贪心,模拟)
1. 1753 Flip Game
题意:
给你一张4*4的01表,让你进行如下操作:选择一个点,与其四相邻的格子及自己反色.
目标: 让所有格子都变为0或1. 输出最小步数题解:
没有难度的状压DFS,将4*4变为16位2进制然后DFS.错误:
1.判断全1时打成(1<<17)-1,没有做到100%了解自己代码的在干什么.
2. 2965 The Pilots Brothers’ refrigerator
题意:
给你一张4*4的01表.
操作:选择一个点,将该点所在的行与列的点全部反色(包括自己).
目标:让所有格子都变为0 输出最小步数及方案(spj).题解:
首先明确:
性质1:如果一个点被反两次那么等于它没反.
性质2:操作顺序改变不会影响最终结果.
性质3:将一个点所在行列全部反色后整张表改变的只有中间那个点.
那么方法就很明确了,只需把表中为1的点所在行列反色便可,然后由于性质1,我们需要记录每个点被反色次数最后的时候%2即可,统计答案只要统计%2后为1的点即可错误:
1.看到这题想都不想一次BFS…然后T了,但理论上这复杂度不是状态数*转移复杂度=2^16*2^4吗..为什么会T. (有了解情况的可以评论,感激不尽)
3. 1328 Radar Installation
题意:
在x轴上方有1000个点,你可以在x轴上放覆盖范围为以r为半径的机器,要求用最少的机器覆盖题目给你的点.求最小点数量.题解:
首先这是个贪心. 我们先把每个点转换成线段,表示在这个线段内放机器能覆盖到它.
那么这个问题就变成了经典的区间选点问题.
我们只需先按线段的终点排序然后记录一个值pos表示当前机器放在pos点,那么如果一个线段的l>pos那么就ans++并更新pos.错误:
1.多组数据读入时终止条件为n==0 && r==0,但我在读入时写了while(cin>>n>>r && n && r) 于是GG了.
2.计算线段时勾股定理的答案用int存了…
3.当一个标程用G++交的时候T而用C++则A..(原因:C++对cin有一定优化而G++没有)
4. 2109 Power of Cryptography
题意:
有算式k^n=p,给你n,p,让你求k. (n<=200 p<=10^101)题解:
第一眼看到这题有两个想法,高精爆搞和double水过,那么我抱着侥幸心理写了一发水,然后就过去了…
double水过: 由于k^n=p ->k=p^(n-1) 然后用pow就OK了
高精: 二分k,然后高精幂算出当前k^n次,与p比较错误:
1.多组数据读入时终止条件为EOF,但我在读入时写了while(scanf(“%lf %lf”,&n,&p)),没有加!=EOF,于是GG了.(没加EOF时貌似终止不了程序)
5. 2586 Y2K Accounting Bug
- 题意:(这题意真心难懂…)
一年12个月,给你s和d,表示如果盈利则赚s元,如果亏损则亏d元.
每五个月进行一次统计,统计八次(1-5月一次,2-6月一次…….)统计的结果是这八次都是亏空。
目标:判断全年是否能盈利,如果能则求出最大的盈利。如果不能盈利则输出Deficit - 题解: 终于遇到一题比较好想的贪心
为了满足每五月亏一次并且所有的都要赚,我们要保证每五个月亏的值最低,那么我们就只要枚举xs< yd(x+y=5) 便可以根据每种情况求出最大盈余额,嗯画出来差不多长这样
4*s < 1*d:ssssdssssdss
3*s < 2*d:sssddsssddss
2*s < 3*d:ssdddssdddss
1*s < 4*d:sddddsddddsd
注意亏0元算盈利… - 错误: 终于1A了
6: 3295 Tautology
- 题意:
给你一个长度100的字符串,包含 K, A, N, C, E, p, q, r, s, t.
其中小写字母代表bool变量,大写字母代表位运算符.
K->与,A->或,N->非,C->包含,E->同或.
问该表达式是否永真. 题解:
显然就是一道大模拟题…
首先我们注意到只有5个变量,也就是说只有2^5=32种情况,直接暴枚,然后O(n)扫一遍每种情况.
那么怎么扫? 很容易发现题目中的字符串是前缀表达式,根据套路要从后往前扫,每遇到一个符号,弹出栈中对应需要的数字然后push进答案,如果有一种情况的答案是false 那就直接return掉了错误:
1.第一次从前往后扫了,然后被discuss里的数据×掉了
7. 1086 Unscrambling Images
*:此题不在列表上,纯属智障做错题…
- 题意: (这题真是道语文题…)
背景是一个四叉树转正方形的表示方法,四叉树中只有叶子节点有权值且每个节点的度数非0即4.
我们考虑一个非叶子节点,其4个孩子所占的空间分别为其父亲的左上,左下,右上,右下四个象限(区块),并且第几个孩子占哪块是题目给的,该性质也是递归的
题目会给我们一个四叉树的结构让我们输出正方形的结构
输入格式:
第一行:T -> 数据组数
- 每组数据:
- 第一行:n 表示你要输出的将是一个n*n的矩阵
- 第二行:m 表示所给的树的边数
- 以下m行:描述树结构
- m+3行: s 表示叶子结点个数
- 以下q行: 表示各个叶子节点的权值
题解:
没什么好讲的,直接模拟,也没什么坑.主要还是题面难懂错误: 1A
8. 1068 Parencodings
题意:
对于一个合法的括号串有两种表达方式:
p[]:p[i]表示在序列中第i个右括号的位置之前有几个左括号.
w[]:w[i]表示在序列中第i个右括号的位置之前匹配的括号数.
现在给你一个括号串对应的p[],要求输出w[]. (p.size()<=20)题解:
1.直接大模拟:利用p数组的特性把原括号串求出来,然后再根据原串求w.(然而这个方法不是特别的严谨,因为题目中并没有讲数组元素的数据范围,如果p[i]>1000000那岂不是GG了)
2.分析p[]和q[]的性质,我们发现其实可以维护一个match[],match[i]表示第i个右括号匹配第match[i]个左括号,那么对于w[i]我们只需统计出match的前i(包括i)个元素中大于等于match[i]的有多少个.也就是w[n]=∑i=1n[match[i]>=match[n]]
9. 2632 Crashing Robots
题意:
在一个m行n列的矩阵中,记左下角为(1,1),有s个机器人,它们将执行q条指令.
指令格式: 机器人编号 指令内容 重复执行次数
指令内容: L->左转; R->右转; F->前进
要求:判断这些指令是否能全部执行完
如果可以,输出OK
否则如果机器人撞边界了就输出Robot x crashes into the wall
否则如果机器人撞到别的机器人就输出Robot x crashes into robot y题解:
对每个机器人开个struct记录它的坐标和朝向,然后再开个G数组记录整个矩形的情况便于判断合法性.最后直接一步步模拟就行了. 这道题主要的难点在于对那个n*m的矩阵的方向的处理,其它的就没什么了.错误:1A
10. 1573 Robot Motion
题意:
给你一个n*m的矩阵,机器人初始位置在第一行第s列,矩阵中每个元素代表一个方向,表示机器人在这个格子时要走的方向.求机器人是否能走出矩阵,如果行就输出步数,否则输出循环前走的步数和循环步数题解:
注意处理方向的问题,然后直接模拟,记录到每个点的步数,如果重复就说明循环了.错误:1A
11. 2993 Emag eht htiw Em Pleh gpj.稽滑
题意:
给你国际象棋中棋子的位置,让你按一定格式输出棋局,详情请见题目…题解:
就是一道普通的字符串模拟题,注意行数从下到上才是1~8,然后就没什么难度了错误:1A
12.2996 Help Me with the Game 滑稽.jpg
题意:
输入输出跟2993反了一下…题解:
也是一道普通的字符串模拟题,注意行数从下到上才是1~8,然后就没什么难度了错误:1A
===================building=======================
*:poj居然维修中