省常中模拟 Test2 Day2
two
模拟
大意:给你一个 N 位二进制数,有四种操作:加1、减1、乘2、整除2。给定一个操作序列,求最终结果。N <= 5*10^6。数据保证不会在最高位上进行进位或退位操作。
初步解法:由于题目中的特殊限制(操作不影响最高位),我们可以直接用一个 char 数组和一个尾指针来进行操作。「加1」操作即从最后一位往前找连续的 1 并将其改成 0,然后将遇到的第一个 0 改成 1,并结束循环。「减1」操作类似,找连续的 0 并将其改成 1,将遇到的第一个 1 改成 0。「乘2」操作即在末尾添加一个 0,「除2」操作即删去末尾一位。有两个很明显的优化:如果「加1」操作后面紧跟「减1」操作就直接跳过这两个操作;「乘2」与「除2」相连时同理。要注意的是如果「除2」后面跟的是「乘2」,那么得到的结果不一定等于原数(想一想,为什么?)。
这样的算法最坏情况下时间复杂度为 O(N^2),最多拿 60 分。不过由于最近 RP 爆发,用这种方法还是轻松 AC 了。
正解:将加减操作不断累加到一个计数器中。若遇到乘则原数与累加器都乘以2,若遇到除则清空累加器,将其向前进位。
还有一种更好玩的算法是,将连续的 0 和 1 缩在一起,如 100011001 可以表示为 (1, 1), (0, 3), (1, 2), (0, 2), (1, 1),那么对应的操作就会变得非常简单,不再赘述。
chess
哈希表
大意:在棋盘上放置若干个皇后,要求输出最终棋盘上不会被攻击到的格子数。
正解:我们知道,每次在棋盘上放置一个皇后都(可能)会使安全格子数减少,所以我们只需不断减去被攻击的格子数即可。
如何计算被攻击的格子数?为了方便我们先不考虑对角线。每次放入一个皇后,如果该行已经被其他皇后控制(用一个哈希表判断),那么不需要处理,否则就改变哈希表中的值并累加 cnt_of_row (被控制的行数);对于列就可以用另一个哈希表作类似处理。处理完所有皇后我们就能知道有哪些行、哪些列已经被控制,那么被控制的总格子数为 cnt_of_row * num_of_col + cnt_of_col*num_of_row – num_of_row*num_of_col(一个简单的容斥原理:被控制的行数乘以每行的格子数加上被控制的列数乘以每列的格子数减去被重复计算的格子数)。
然后考虑对角线上的控制。对角线有两种方向(主对角线与次对角线),可以设两个哈希数组。对于每个皇后所在的两条对角线,我们可以计算出其对角线覆盖的范围,对于其覆盖范围的每个点,判断其行与列是否已经被控制:如果已经被控制,那么不必累加;否则就将被控制格子数加一。
sam
递推
详见我的另一篇文章:《用矩阵乘法优化递推》。
省常中模拟 Test2 Day2的更多相关文章
- 省常中模拟 Test3 Day2
matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...
- 省常中模拟 day2
第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- 省常中模拟 Test4
prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...
- 省常中模拟 Test3 Day1
tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...
- 省常中模拟 Test1 Day1
临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- 如何在C#中模拟C++的联合(Union)?[C#, C++] How To Simulate C++ Union In C#?
1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始.分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数. ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
随机推荐
- 你真的知道css三种存在样式(外联样式、内部样式、内联样式)的区别吗?
css样式在html中有三种存在形态: 内联样式:<div style="display: none"></div> 内部样式: <style> ...
- 2-Highcharts曲线图之折线图
示例图片,在网上下载一张图片如图:其中数据自定义 引入上节模版配置 在script标签中写代码:具体代码如下 信息将在代码中解释. 分析:“五省收益趋势”是标题: x坐标为[2011年-2016 ...
- POJ3468 A Simple Problem With Integers 树状数组 区间更新区间询问
今天学了很多关于树状数组的技巧.一个是利用树状数组可以简单的实现段更新,点询问(二维的段更新点询问也可以),每次修改只需要修改2个角或者4个角就可以了,另外一个技巧就是这题,原本用线段树做,现在可以用 ...
- 核稀疏表示分类(KSRC)
参考:<Kernel SparseRepresention-Based Classifier> 原文地址:http://www.cnblogs.com/Rosanna/p/3372153. ...
- 为什么Android 3.0如此罕见?
3.0(2011年2月)代号蜂巢,专用于android系统的平板电脑,不用于手机.4.0(2011年5月公布)的开发就是让平板电脑和手机能够共用一个版本的系统.4.0通用于平板电脑和手机.
- 匿名用户访问sharepoint2010中的列表
Allow anonymous users to access listitems on a publishing site in SharePoint 2010 https://knowledge. ...
- mapreduce程序编写(WordCount)
折腾了半天.终于编写成功了第一个自己的mapreduce程序,并通过打jar包的方式运行起来了. 运行环境: windows 64bit eclipse 64bit jdk6.0 64bit 一.工程 ...
- sudo: /etc/sudoers 的模式为 0551,应为 0440
环境:Ubuntu 12.04.4 LTS 32bit 本想修改/etc/sudoers文件,取消sudo权限的密码.但是因为sudoers文件无‘w’(写)的权限,然后用命令加写权限的时候加错了,加 ...
- java String 空指针异常
如下代码中,第8行和第10行均会提示Exception in thread "main" java.lang.NullPointerException. 第12行的写法可行. im ...
- Project Euler 97 :Large non-Mersenne prime 非梅森大素数
Large non-Mersenne prime The first known prime found to exceed one million digits was discovered in ...