省常中模拟 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 ...
随机推荐
- c库函数之scanf
scanf()函数的原理 想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组. 当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入. ...
- 【BZOJ】【1934】【SHOI 2007】Vote 善意的投票
网络流/最小割 简单题= =直接利用最小割的性质: 割掉这些边后,将所有点分成了两部分(两个连通块),我们可以假定与S相连的是投赞成票,与T相连的是投反对票. 那么如果一个小朋友原本意愿是睡觉,那么连 ...
- Java多线程——<一>概述、定义任务
一.概述 为什么使用线程?从c开始,任何一门高级语言的默认执行顺序是“按照编写的代码的顺序执行”,日常开发过程中写的业务逻辑,但凡不涉及并发的,都是让一个任务顺序执行以确保得到想要的结果.但是,当你的 ...
- oracle——表修改语句集合
alter table table_name modify column_name default 0;
- 在线最优化求解(Online Optimization)之二:截断梯度法(TG)
在线最优化求解(Online Optimization)之二:截断梯度法(TG) 在预备篇中我们做了一些热身,并且介绍了L1正则化在Online模式下也不能产生较好的稀疏性,而稀疏性对于高维特征向量以 ...
- 【转】System.DateTime.Now.ToString()的一些用法
C#中的日期处理函数 //2007年4月24日 this.TextBox6.Text = System.DateTime.Now.ToString("D"); ...
- (一)、http原理
谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传输的一些情况,从回复来看,争议还是有的.随着网络越来越普及,应用越来越广泛,一 ...
- CentOS安装视频播放器SMPlayer
首先下载rpmforg,下载对应的版本,就是对应CentOS版本,还有32位与64位也要对应上.地址如下: http://wiki.centos.org/AdditionalResources/Rep ...
- Opc
http://www.tuicool.com/articles/nymUz2 http://blog.chinaunix.net/uid-20692368-id-3434001.html http:/ ...
- java io异步
1.一般来说,可以通过多线程的方式来实现异步 2.同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的暂时等待: 3.而阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的 ...