Topcoder SRM 刷题企划

1.本文用来记录自己在Topcoder上刷过的题目。不过重点是记录心得,记录自己的思路问题。

2.刷的题目全部都是Div2 1000分的题目,小概率会去做Div1 的进阶题。

3.基本上自己写出来的题目都不会另开一篇来写。

4.Topcoder使用: 【教程1教程2

SRM 508 Div2 YetAnotherORProblem (Div2 Hard)

  题意:构造长度为N,各元素上限为R的序列,并且满足$A_1+A_2+\cdots+A_n=A_1|A_2|\cdots|A_n$,求方案数(mod 1e9+7)。(N≤10,R≤15000)

  思路:显然与二进制相关。转移的时候将长度作为层,应从子集向原集合更新。由于要枚举集合的子集,所以复杂度近似看成$O(3^n)$。总复杂度$O(n 3^n)$。

SRM 509 Div2 NumberLabyrinth (Div2 Hard)

  题意:给定一张地图和起终点的坐标。对于格子C,如果为‘.‘,则可以填入0-9(只能填k次);如果为数字num,则可以向任意方向移动num格。求从终点到起点移动的最少次数,无解输出-1。(n,m,k≤50)

  思路:暴力bfs即可。还要记录已经修改过的次数,所以能判掉的状态会比较少,但时间上不成问题。

SRM 510 Div2 TheLuckyBases (Div2 Hard)

  题意:给定N,找出所有符合题意的B进制,满足$S[0]*B^0+S[1]*B^1+\cdots+S[k]*B^k=N$,S[i]只为4或7。求方案个数,有无限个输出-1。(N≤$10^{12}$)

  思路:首先判掉4和7。因为N-S[0]一定是B的约数,范围在$10^{12}$,所以可以在$O(\sqrt{n})$范围内刷出素因子,约数的数目也不会超过2000。暴力处理这些约数即可(注意可能会处理了B=1的情况,导致陷入死循环)

    官方题解对不同的范围运用不同的暴力做法。当B进制下只有2位时,直接计算出B($B=\frac{N-S[0]}{S[1]}$);当≥3位时,显然有$B\le \sqrt{N}$,于是可以暴力处理。复杂度仍然是$O(\sqrt{N})$,但是代码会更加简洁。

SRM 511 Div2 FiveHundredEleven (Div2 Hard, Div1 Mid)

  题意:Fox Ciel和Toastman在玩一个游戏。现在有N张卡片,写有0~511之间的一个数字。游戏开始时累计值为0。游戏过程中两人交替操作,Fox为先手。每次玩家从之前未被选中的卡片中任意选择一个,对目前的累计值进行位或运算。如果某个玩家不能选择任何数字,或者某位玩家在选择数字之后累计值变为511,那么这位玩家就输了。现在两人都选择最优策略,判断谁会获胜。(N≤50)

  思路:【题解】

SRM 512 Div2 DoubleRoshambo

  题意:分别给出两位玩家的N组手势。规则为双手剪刀石头布(左手对左手,右手对右手)。对于某玩家,有以下得分情况:1.左右手均胜利(计2分);2.右手胜利左手平局(计1分)。求玩家一的最大得分。

  思路:显然每个手势对应的2分和1分情况是唯一确定的。那么是否存在拆掉2分反而得分更大的情况?假如交换2分和0分的一组匹配,显然不会配出3分的情况,最多只会配出两个平局,而此时先配2分在分数上是等价的。证明:有匹配{k1-k2,k3-k4},且{k1-k2}=0,{k3-k4}=0,现在交换k2,k4。如果{k1-k4}=2,此时k3=k4,则{k3-k2}={k3-k4}=0;如果{k3-k2}=2,说明k1=k3,则{k1-k4}={k3-k4}=0。即始终无法配出超过2分的情况。同理其他情况也可yy。

    本题在官方题解上还有暴力的匈牙利算法处理最小完美匹配的做法。

时间: 2024-10-11 12:47:48

Topcoder SRM 刷题企划的相关文章

TopCoder SRM 刷水

怎么样快速提高姿势水平呢?自信说应该做TopCoder! 于是我就看到了很多XJOI题,BZOJ题……好像可以搬些题呢! 简单整理一下,方便未来搬题(雾 462C:先考虑从某个点出发,其出边有不能走的边,到终点距离在最坏情况下的最小值.再考虑从某个点出发,还不知道不能走的边在哪时,到终点距离在最坏情况下的最小值.前者枚举每条出边跑最短路,后者反着跑最短路,然后和前者的答案取较大值. 463C:BZOJ2454,一个点最多只有三种转移,某些情况下只有两种,如果以这些点为根来看,整个转移的结构就是一

Topcoder 刷题之路_鶸的奋斗

最近碰到的题不是水题就是坑题,实在没意思,听说神犇们都在Topcoder上刷SRM,于是我决定将SRM的DIV 1刷个遍.由于是系列博客,所以我就不贴代码了,只写做法. 哎..好多转博客不注明出处的,这里给出本博客的出处:http://www.cnblogs.com/HarryGuo2012/p/4771117.html Topcoder SRM 144 DIV 1 BinaryCode 题意是:定义串P,Q,其中Q[i]=P[i-1]+P[i]+P[i+1],边界取0,并且P必须是01串.现在

Topcoder SRM 619 DIv2 500 --又是耻辱的一题

这题明明是一个简单的类似约瑟夫环的问题,但是由于细节问题迟迟不能得到正确结果,结果比赛完几分钟才改对..耻辱. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define ll long long using namespace std; #define NN 370000 class Choo

TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序. 可以从暴力法入手,然后优化. 这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的. 思路: 1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了: 2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那

TopCoder SRM 634 Div.2[ABC]

TopCoder SRM 634 Div.2[ABC] ACM 题目地址: TopCoder SRM 634 赛后做的,感觉现场肯定做不出来Orz,简直不能多说. Level One-MountainRanges[水题] 题意: 问序列中有几个完全大于旁边的峰. 分析: 傻逼题,不多说. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: one.cpp * Create Date: 2014-09-26 21:01:23 * Desc

topcoder SRM 618 DIV2 MovingRooksDiv2

一开始Y1,Y2两个参数看不懂,再看一遍题目后才知道,vector<int>索引代表是行数,值代表的是列 此题数据量不大,直接深度搜索即可 注意这里深度搜索的访问标识不是以前的索引和元素,而是一个交换元素后的整个状态vector<int>,这样可以避免重复元素的搜索 set<vector<int> > visit; bool flag; void dfs(vector<int>& src, vector<int>& d

topcoder SRM 618 DIV2 LongWordsDiv2

此题给出的条件是: (1)word的每个字母都是大写字母(此条件可以忽略,题目给的输入都是大写字母) (2) 相等字符不能连续,即不能出现AABC的连续相同的情况 (3)word中不存在字母组成xyxy的形式,即不存在第一个字符和第3个字符相等同时第2个字符和第4个字符相等的情况 对于第(2)种情况,只需要考虑word[i]!=word[i-1]即可 对于第(3)种情况,用一个4重循环遍历每种可能的情况,然后第一个字符和第3个字符相等同时第2个字符和第4个字符相等,则输出“DisLikes”即可

国内有哪些好的刷题网站?

http://www.zhihu.com/question/25574458 Luau Lawrence,Data Mining 弱鸡 / [email protected] 温梦强.石一帆.知乎用户 等人赞同 - Welcome To PKU JudgeOnline 北京大学的Online Judge.POJ上面的题目有点老了,但好处是做的人多,经典算法题多,解题报告也多,适合上手.- ZOJ :: Home 浙江大学的Online Judge.ZOJ用的不多,但为数不多的几次体验好像都还可以

topcoder SRM 522 DIV2 BoxesDiv2

注意题目这句话,Once you have each type of candies in a box, you want to pack those boxes into larger boxes, until only one box remains. 两个box合并后必须放入更大一个盒子 题目的有点类似huffman的前部分,此题用堆去做,由于priority_queue是用堆实现的,故可以直接使用 每次从堆中选取最小的两个进行合并即可 #include <iostream> #incl