topcoder SRM 622 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…
关于斐波那契数列,由于数据量比较小, 直接打表了,代码写的比较戳 #include <iostream> #include <vector> #include <algorithm> using namespace std; class FibonacciDiv2{ public: vector<int> table; void make_table(){ table.push_back(); table.push_back(); ; do{ ; newDa…
\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对于一个长度为 \(n\) 的排列,定义其的贡献为对其建笛卡尔树,树上有两个儿子的节点其左右儿子在原排列中的距离之和,给出 \(n, Mod\),求所有长度为 \(n\) 的排列的贡献之和对 \(Mod\) 取模的值 \(1 \leq n \leq 100\) 解题思路 : 考虑一个最暴力的 \(dp\) ,设…
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一个 \(W \times H\) 的网格,每一格上有一棵树和一个随机字母 \(S\) 或 \(E\) ,有一只熊在左上角,按从上到下从左到右的顺序遍历每一行每一列,如果其遇到一棵可以推倒的树,就尽可能按照字母表示的方向 (向下,向右) 推倒它,然后其推倒方向的下一棵树就不能被推倒了,同时树不能被推倒在边界之外…
周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are numbered from 0 to N-1. Some pairs of rooms are connected by bidirectional passages. The passages have the topology of a tree. That is, there are exactly N-…
脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚举公差,找到能有多少就可以了. C:想到MAP,但是前面太脑掺,只有几分钟写.. 不过还真不一定写的出来.. 进来DP感觉良好.. 我们可以发现其实这些的乘积其实比较少.. 然后就像普通数组进行加法一样. #include <cstdlib> #include <cctype> #in…
先用dfs搜索所有的情况,然后判断每种情况是不是括号匹配 #include <vector> #include <string> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <func…
题目比较简单. 注意看测试用例2,给的提示 Please note that this is the largest possible return value: whenever there is a solution, there is a solution that uses at most two moves. 最多只有两步 #include <vector> #include <string> #include <list> #include <map&…
贪心的题,从左向右推过去即可 #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #i…
树形Dp的题,根据题意建树. DP[i][0] 表示以i为根节点的树的包含i的时候的所有状态点数的总和 Dp[i][1] 表示包含i结点的状态数目 对于一个子节点v Dp[i][0] = (Dp[v][1]+1)*Dp[i][0]+Dp[v][0]*Dp[i][1] 表示子节点的所有状态与i的所有的状态之间的组合(可以不组合,所以DP[v][1]+1), 接下来更新i的状态数目 DP[i][1] = Dp[i][1]*(Dp[v][1]+1) 这样就可以算出来i结点为根结的所以状态,树中的所有点…
本题就是求所有连续子数列的和 开始拿到题目还以为求的时数列子集的和,认真看到题目才知道是连续子数列 循环遍历即可 int findSum(vector <int> array) { ; ; i < array.size(); ++ i ){ for(int j = i; j < array.size(); ++ j){ for(int k = i ; k <= j ; ++ k){ sum +=array[k]; } } } return sum; }…
典型的条件概率题目. 事件A在另外一个事件B已经发生条件下的发生概率.条件概率表示为P(A|B),读作“在B条件下A的概率”. 若只有两个事件A,B,那么, P(A|B)=P(AB)/P(B) 本题的设事件Alice赢为B,事件Alice投掷数字x为A,则事件Alice投掷数字x且赢为AB 则求在Alice赢的条件下求Alice投掷的数字,即求P(A|B):根据上面公式求解即可 double getExpectation(int a, int b) { ,AB = ; double prob_a…
题目的意思是给一个01的字符串数组,让你去求解满足棋盘条件的最大棋盘 棋盘的条件是: 相邻元素的值不能相同 此题有点像求全1的最大子矩阵,当时求全1的最大子矩阵是用直方图求解的 本题可以利用直方图求解 首先找到子矩阵的两个顶点坐标(x0,y0),(x1,y1) 我们能遍历开始和结束列,y0=i, y1=j, 我们可以在y0和y1之间寻找满足条件的的最大棋盘,即在y0和y1之间找高度最大的满足条件的子矩阵 然后遍历i,j取最大的即可 对于满足条件的子行,有两种情况,一种是010101...,另一种…
题目的意思是给你一组数,然后不断的进行除法(注意是大数除以小数),然后将得到的结果加入这组数种然后继续进行除法, 直到没有新添加的数为止 此题按照提议模拟即可 注意要保持元素的不同 int CountNumbers(vector <int> numbers) { set<int> ss(numbers.begin(),numbers.end()); bool flag = true; while(flag){ flag = false; ; i < numbers.size(…
由于题目数据量比较小,故可以开辟一个数组存储每个index出现的次数 然后遍历即可 string canItBeDone(int k, vector<int> A){ vector<,); int n = A.size(); ; i < n; ++ i) cnt[A[i]]++; ; i <=n ; ++ i){ ){ cnt[i] -- ; }else{ bool flag = false; ; j < i; ++ j ){ ){ cnt[j]--; flag = t…
由于题目告诉肯定至少存在一种解, 故只需要根据条件遍历一下, vector <int> makeExpression(int y) { vector<int> res; ; i <=; ++ i){ ; j <= ; ++ j){ && i!= && j!=&& j!= ){ int k = y-i*j; && k<= && k!= && k!=){ res.push_…
注意题目给的最后一句话,如果部门任何employee都做不同类型的工作,则这个部门是一个diverse,题目是计算department的diverse数 读起来感觉有点别扭,英语没学好的原因 int countGood(vector <int> superior, vector <int> workType) { ; ; i < superior.size(); ++ i){ set<int> department; department.insert(workT…
一开始Y1,Y2两个参数看不懂,再看一遍题目后才知道,vector<int>索引代表是行数,值代表的是列 此题数据量不大,直接深度搜索即可 注意这里深度搜索的访问标识不是以前的索引和元素,而是一个交换元素后的整个状态vector<int>,这样可以避免重复元素的搜索 set<vector<int> > visit; bool flag; void dfs(vector<int>& src, vector<int>& d…
只需要对word遍历一遍即可 int write(string word) { ; ; i < word.length(); ++ i){ cnt+=word[i]-; } return cnt; }…
此题给出的条件是: (1)word的每个字母都是大写字母(此条件可以忽略,题目给的输入都是大写字母) (2) 相等字符不能连续,即不能出现AABC的连续相同的情况 (3)word中不存在字母组成xyxy的形式,即不存在第一个字符和第3个字符相等同时第2个字符和第4个字符相等的情况 对于第(2)种情况,只需要考虑word[i]!=word[i-1]即可 对于第(3)种情况,用一个4重循环遍历每种可能的情况,然后第一个字符和第3个字符相等同时第2个字符和第4个字符相等,则输出“DisLikes”即可…
从大到小遍历一遍,每次取M个元素,然后求得最小的floor即可 int minimum(int M, vector <int> heights) { sort(heights.begin(),heights.end()); int minFloor = 10000; for(int i = heights.size()-1; i >=M-1; -- i){ int floor = 0; for(int j = 0; j < M; ++j) floor +=heights[i]-he…
排个序,求前k个元素和即可 int minimum(int K, vector <int> danceCost) { sort(danceCost.begin(),danceCost.end()); return accumulate(danceCost.begin(),danceCost.begin()+K,0); }…
此题需要注意的两个地方是 (1)在某天生产出来的Slimonades,必须在stale_limit天内必须卖完,否则超过stale_limit内抛弃(东西都有保质期) (2)每天生产出来的Slimonades的数量在0到morning[i]之间,而不是morning[i] 故第i天卖的东西可能来自max(0,i-stale_limit+1)~i 之间任何一天的东西,假设j在这些天数之间, 则第j天生产的东西在第i天卖的数量为min(morning[j], customer[i]),故遍历一遍即可…
解决本题的一个关键点就是当Cat进入时,此时Rat在哪个位置? 注意移动方向可以随时改变,由于是圆环,故离入口最远点的距离是pi*R,即圆的一半, 当cat进入时(cat的速度大于rat的速度,否则不可能追上) 如果rat移动的距离小于圆环的一半,即此时rat的位置为移动最远的位置 如果rat移动的距离大于圆环的一半,则可以在pi*R附近摇摆,当cat进入则刚好rat在pi*R即可 之后保持与rat相同的方向即可 #include <iostream> #include <algorit…
比较简单的一题,纠结比较久的是把my_cmp和my_minus放在类中,利用sort函数会出现 no matching function for call to ""sort(std::vector<Interval>::iterator, std::vector<Interval>::iterator, <unresolved overloaded function type>)"" 当把这两个函数放在类外面时就行了 #incl…
题目题意是交换一次,使数字最小,且数字前面不能有前导0 string minNumber(string num) { string res = num; for(int i = 0 ; i < num.size(); i ++ ){ for(int j = i + 1; j < num.size(); j ++ ){ if(i == 0 && num[j] == '0') continue; else{ swap(num[i],num[j]); res = res > n…
这题明明是一个简单的类似约瑟夫环的问题,但是由于细节问题迟迟不能得到正确结果,结果比赛完几分钟才改对..耻辱. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define ll long long using namespace std; #define NN 370000 class Choo…
题意:给定两个NxN的棋盘,每个棋盘都有一个‘车’的摆放状态,问进行若干次交换,能否使棋盘1变为棋盘2. 交换规则:每次选两个‘车’,坐标分别为(r1,c1),(r2,c2),如果r1<r2并且c1>c2,则可以将两个点分别移到(r1,c2),(r2,c1). 做法:BFS,从状态Y1广搜,每次选两行r1,r2(r1<r2),如果满足r1行的‘车’的列c1<c2(r2行的‘车’的列),则交换,得到下一个状态点,如果不是目标态,则继续搜索,知道交换完所有状态. 代码: #includ…
#include <iostream> #include <cstdlib> using namespace std; class TheArithmeticProgression{ public: double minimunChange(int a,int b, int c){ *b-a-c)+; } };…
#include <iostream> #include <vector> #include <algorithm> #include <iterator> #define LL long long using namespace std; class LittleElephantAndPermutationDiv2{ public: LL getNumber(int N, int k){ LL res = ; vector<int> a(N);…