- 博客(31)
- 收藏
- 关注
原创 Codeforces E1. Reading Books (easy version) (模拟) (Round #653 Div.3)
传送门题意: 现有n本书,每本书有三个性质:ai 阅读所需时间,bi = 1 表示Alice 喜欢该书, ci = 1 表示Bob喜欢该书。试问能否找到最好方案—Alice和Bob喜欢的数都至少有k本,且总阅读时间最短;若没有可行方案输出-1.思路:先将所有书分为三个组:both两个人都喜欢的书,alice只有Alice喜欢的书,bob只有Bob喜欢的书;并将三个组按升序排序。如果不能满足k本书的条件直接输出-1再取最小的方案:先考虑both的数量不够k本或both中的时间比alice[i]
2020-06-30 20:00:55 178
原创 Codeforces D. Zero Remainder Array (思维 / 模拟) (Round #653 Div.3)
传送门题意: 现有一个初始数组a,可对其每个数进行一次下列两种操作之一(x的初始值为0)ai += x, x ++x ++以使数组变成目标数组(每个数都是k的倍数)思路:计算没个数的目标次数 t = k - a[i] % k,若t为正整数,记录t出现的次数,若t为0则可以直接忽略(说明a[i]已经是k的倍数)假设t的数组为1,2,3,4,5那么需要重复的次数ans就为其maxx(即5);若t的数组为1,2,2,2,4的话,那么除了取其maxx(即4)外,另外两个2还需循环两次,对ans
2020-06-29 20:19:54 3762
原创 Codeforces D. Game With Array (构造) (Round #643 Div.2)
传送门题意: 需要你构造一个n个正整数元素的数组,必须满足数组元素总和为s,且存在一个k,(0 <= k <= s),使得找不到任何非空子数组的元素和等于 k 或 s - k,如果有这样的数组,输出YES和任意输出数组元素,并且输出k。思路:思路很简单,直接构造一个有 n - 1 个 1 的数组,那么另一个元素便是s - n + 1,并选定k = n。再判断一下若s - n + 1 > n,若s - n + 1 > k的话就是存在答案数组的代码实现:#includ
2020-06-28 20:33:24 3241
原创 Codeforces D. Maximum Sum on Even Positions (思维 / 最大子段和)(Round 90 Rated for Div.2)
传送门题意: 现有一个数组a,你可以翻转一次任意一段子序列,以使所有偶数位(下标从0开始)的和max。思路:显然选择的序列必须是偶数个数,因为奇数个数翻转后根本没有意义(在实现代码时下标可以从1开始方便处理,取奇数位的和便可);并先统计所有奇数位的和ans,再从前往后遍历先处理偶数位 i 与 i - 1 的交换情况;不断统计交换后的贡献值,若贡献值为负便舍弃前面的子段(就像dp思维一样),最后统计所有贡献值的max为maxx1再处理偶数位 i 与 i + 1 的交换情况,和上一种情况一样取出贡
2020-06-27 11:34:31 336
原创 Codeforces C. Pluses and Minuses (思维 / 模拟) (Round 90 Rated for Div.2)
传送门题意: 实现一下伪代码分析以上伪代码得两种情况:当cur < 0时会break当前for循环,然后cur ++,重新开始当cur始终 > 0时会跑完内部循环,最后终止程序思路:分析易得若最开始cur始终 > 0则万事大吉,但若过程中遇见几次cur < 0就好重来几次,显然时间复杂度就高了。我们可以用数组a来记录字符串s的前缀和,并用sum数组记录每次cur < 0的位置,用tmp记录上一次cur < 0时的前一位置的前缀和并不断更新cur会在
2020-06-26 18:08:42 307
原创 Codeforces C. Number Game (数学 / 博弈) (Round #651 Div.2)
传送门题意: Ashishgup 与 FastestFinger 比赛,给出一个初值n,可进行一下操作:如果n > 1,便 n –除以一个大于 1 并且必须是奇数的因数,可以除以自己,如果自己是奇数的话最先不能动的输掉比赛,输出游戏最后的赢家。思路:因为A先操作,若n为奇数,除以自己,A赢。若n为偶数,只要有一个因数是奇数,那么一定存在最大的奇因数,除以这个最大的,一定变为偶数,若不为 2 ,对手减一后 ,则A 一定赢。代码实现:#include <cstdio&g
2020-06-25 19:11:02 261
原创 Codeforces C. RationalLee (思维) (Round #652 Div.2)
传送门题意: 给你n个数,有m个朋友,每个朋友要拿其中w[i]个数,每个人获得的幸福值是他拿的数的最大值与最小值的和,如果只有一个数最大值最小值都是它,让你求出所有人能获得的最大幸福值是多少?思路:由于每个朋友的幸福值是其得到的max和min的和,那么就要保证其最大值经量大将a[]和w[]都先按升序排列,将依次最大的a[i]分给w值为1的朋友,这样他的幸福值就是max*2,贡献值增长最快。将所有w[i]为1的处理完后,再将a数组的max和min分配给w[i]最大的朋友,剩余的w[i] - 2个
2020-06-24 19:11:18 301 4
原创 西科大第十六届ACM程序设计竞赛 E 呼兰河传 (数学)
传送门题意: 沿着河边看一看清冷的夏夜,耳机里是AR的《呼兰河传》。AR的呼兰河并非一条河,而是一个故乡小城的生活日记。静谧的童年,孩子看世界的眼光,花开鸟飞间的自由,塑造了一方那个时代中少有的美好。现在,你需要回答以下问题,才可倾听这首《呼兰河传》带来的温柔,试试吧。给你n个数,选择一些数,使得LCM最大,输出LCM的最大值并对1e9+9取模。LCM:最小公倍数输入:第一行输入一个n,代表数字的个数。第二行输入n个数a[i],代表每个数的值。1<=n<=1e6,1<=a[i
2020-06-23 18:42:20 363
原创 Codeforces C. Social Distance (模拟) (Round #650 Div.3)
传送门题意: 用01字符串表示长度为n的长桌,'1’表示已经有人,'0’表示空位,每个人之间相隔至少k个空位是餐厅的规定。试问还有多少个可以选择的空位,选择后依旧符合规定。思路:模拟一下,如果第一个位置s[0]为空就先选择并记录其位置,再判断如果和后面的人冲突就放弃选择。同理处理后面的位置,从前往后数到k个空位,若第k+1为空就先选择并记录其位置,若与后面的冲突就放弃选择。代码实现:#include <cstdio>#include <cstring>#inc
2020-06-22 18:02:35 192
原创 Codeforces D. AND, OR and square sum (二进制 / 位运算) (Global Round 8)
传送门题意: 现有一个数组a,选两个不同下标的数一个赋值为二者的 ’ & ‘值,另一个赋值为二者的’ | '值。最后计算所以ai ^ 2的和ans,求ans的最大值。思路:1的个数不会变:例如3 和 5,011 & 101 = 001,而011 | 101 = 111;第一位的1,第二位的1,第三位的1的个数都没有变,只是在各个数之间移动(意味着所有数的和不会改变)。因为(a + b) ^ 2 >= a ^ 2 + b ^ 2,所以我们可以大胆处理直接得到答案让有限的1分
2020-06-21 13:53:31 218
原创 Codeforces C. Even Picture (构造 / 模拟)(Global Round 8)
传送门题意: 在一张无限的方格图上,怎样在图中涂色k个点才会使得有n个灰色方格的四周都是灰色,其他k - n个灰色方格四周有两个灰色。思路:以(0,0)为左顶点,x + y = 0上的点取n个,这n个点四周的点就是那k - n个灰点;因此k = n * 3 + 4.代码实现:#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <
2020-06-20 11:16:03 156
原创 Codeforces C. Celex Update (思维) (Round #645 Div.2)
传送门题意: 给出一张地图,每次只能向右或向下移动并得到该位置数字的值,试问从(x1,y1)到(x2,y2)的路径和有多少种?思路:不难发现地图的规律,从右上角到左下角数字依次增加1当然也会发现,若先选定一条路径得到和为x,那么要得到x+1的和便需要选择路径中一个点替换成其相应左下方那个点。于是便能得到规律,和的种类数有|x1 - x2| * |y1 - y2| + 1代码实现:#include<bits/stdc++.h>#define endl '\n'#defin
2020-06-19 17:49:45 212
原创 Codeforces C. Rotation Matching(思维) (Round #648 Div.2)
传送门题意: 现有a,b两个1 ~n 的数组,可以多次选择任意数k并将b循环向左或向右移动可位,试问最后使a与b的最大匹配对数为多少?(i = j 并ai = bj即为匹配)。思路:直接找到没一个数对应的k,并用一个数组f来统计每一个k的贡献值假定x在a中位置为i,在b中位置为j;若i >= j,则k = i - j, 反之k = i - j + n。最后ans与每一个出现的k的贡献值取个max即可。代码实现:#include<bits/stdc++.h>#defin
2020-06-18 18:22:00 171 1
原创 Codeforces C. Ehab and Prefix MEXs (思维) (Round #649 Div.2)
传送门题意: 给定长度为n的数组a,找到长度为n的另一个数组b,使得:对于每个i(1≤i≤n)MEX({b1,b2,…,bi})= ai。一组整数的MEX是不属于该组的最小非负整数。如果这样的数组不存在,输出-1。思路:为了满足a[i]是b1 ~ bi未出现的最小非负整数,则b[i]得为ai ~ n未出现的尽量小的数。这便可以用set统计整个a数组中未出现的数,从1到n开始枚举,每次取set的第一个元素,并将其删除;若i >1时且a[i] != a[i - 1],还可以把a[i -
2020-06-17 18:51:56 238
原创 Codeforces C. Palindromic Paths (回文串 / 思维) (Round 89 Rated for Div.2)
传送门题意: 有一个由0和1组成的n * m矩阵,试问最少改变多少个数,可以使从(1,1)到(n,m)的所有路径都是回文串,输出最小改变的数量。思路:若要让所有路径为回文串,即以(1,1)为圆心k为半径的环和以(n,m)为圆心k为半径的环一样。若每次都遍历斜线会非常复杂。根据坐标(x,y)来统计,因为走到(x,y)需要x + y - 1步。便可以x + y - 为第一关键字,a[x][y]的值为第二关键字来把环上的数统计成{0}和{1}的集合。最后再遍历去最小的集合计入ans就好。代码实现
2020-06-16 19:59:51 143
原创 SCPC :RGB (思维 / 线段树/求最大区间和)
传送门题意:给你一个字符串。字符串由:‘R’ , ‘G’ , ‘B’ 组成。找一个区间,使得能获得的价值最大。价值计算公式:5 * r - 3 * g + br , g , b 分别为字符 R , G , B 的个数。输入:第一行输入一个 N 为字符串长度。第二行输入一个长度为 N 的字符串。0 <= N <= 1000000输出:输出能获得的最大价值。输入样例 13RBG输出样例 16提示选择区间[ 1 , 2 ] 价值最大为 5 + 1 = 6.思路1
2020-06-15 18:32:55 187
原创 SCPC :普普通通的DP(&位运算)
传送门题目描述:给你一个n*m的矩阵,你需要从左上角走到右下角,你每次只能向下或者向右走,并且不能走出矩阵之外。只要你走到终点之后,你就会获得奖励,奖励的金额为:所有经过的元素做“与”运算(津巴韦布)。帮自己算一算,你能获得的最大奖励金额为多少呢?与运算:0&0=0 , 0&1=0 , 1&0=0 , 1&1=1例:假设你从左上角到右下角(包括左上角和右下角)经过的元素为:2,2,3,2。你的奖励金额为:(2 & 2 & 3 & 2)= 2
2020-06-14 22:03:10 243
原创 Codeforces D. The Best Vacation (模拟 / 思维) (Round #645 Div.2)
传送门题意: 一年有n个月,第i月有d[i]天,而一个月的第j天可以拥抱j次。试问选择一年中的哪l连续xt天可以得到最多得拥抱ans?求出最大拥抱值ans。思路:显然若要在某个月中开始选择,那首当其冲得就是月末的那天(贡献值最大)。所有应该从某个月的月末那天开始向前选择连续x天。首先得预处理sum函数来记录连续i天的拥抱值(题目给出可能达到1e6)那么我们可以枚举第i月为选择的末月,计算出当前情况的时间拥抱值summ,再与答案ans取个max就行啦。代码实现:#include<bi
2020-06-13 09:12:10 179
原创 Codeforces E. Maximum Subsequence Value (二进制 / 思维) (Round #648 Div.2)
传送门题意: 在给定的序列中选择一个子序列,若子序列里有k个数,当至少有max(1,k-2)个数在二进制第i位上为1的时候,对答案就有2 ^ i贡献,试问最大的答案是多少。思路:若选定了k个数,那么假设有 >= k - 2个数包含二进制的第i位。那现在只选择3个数,若原来有 >= k - 2个数包含二进制的第i位,那么这三个数种也至少有一个数包含这一位二进制,因此(枚举找到特定的)三个数就能找到最优解。代码实现:#include<bits/stdc++.h>#de
2020-06-12 08:41:18 136
原创 Codeforces D. Solve The Maze (bfs & 贪心) (Round #648 Div.2)
传送门题意: 现有一个n *m 的迷宫,期间 ’ # '表示墙壁, ’ . '表示道路 , ’ G '表示好人, ’ B '表示坏人。试问是否能通过将某些道路改建为墙壁,以让所有坏人不能从(n,m)出口逃出,而所有好人可以。思路: 这题看似很复杂,其实是有规律的。为了避免影响好人的逃亡,应该在坏人的四周建立围墙为了降低时间复杂度,应该以(n,m)为起点开始bfs(),标记所有能到达的点。最后遍历一遍,若有某个好人未被标记就是"NO",反之就是"YES"啦。代码实现:#include<
2020-06-11 18:12:16 174
原创 POJ 1797 Heavy Transportation (最短路 / 求路径最小边)
传送门题意: 有n个交叉口,m条路,每条路有三个属性:起点,终点,最大载重。假设从a到b的最大载重是从a -> b所能承载的最大重量,问从1 -> n的最大载重是多少?思路:其实和上一题非常相似,只不过上一题是求路径最小的最大跳跃距离,而这个题感觉是在求最小的最小承载重量。其实就是Dijkstra()一下,只不过上一题的d[i]表示0 -> i 的最小最大距离,而这一题的d[i]就表示1 -> i的最大承载重量。代码实现:#include <iostream
2020-06-10 16:52:27 155
原创 POJ 2253 Frogger (最短路 / 求路径最大边)
传送门题意: 有n个石头,各个石头之间都可以通过跳跃到达,试问从a[0]到a[1]的途中需要跳跃的最小最大距离为多少。答案保留三位小数。思路:因为a[1]到a[2]是绝对能到达的(至少可以直接a[0]跳到a[1]),所以我们只需Dijkstra()一遍就好。用d[i]表示a[0]到a[i]过程中的最大跳跃距离,再用max(d[j],f[i][j])来更新d[j]就行。代码实现:#include <iostream>#include <cstdio>#includ
2020-06-09 19:49:11 145
原创 HDU1542 Atlantis (线段树 / 求总面积)
传送门题意: 给出许多岛屿的坐标,试求出所有岛屿的总面积(岛屿面积的并)。输入:描绘了每张地图时,包含四个数字x1,y1,x2,y2(不一定是整数),(x1,y1)和(x2,y2)分别是地图的左上角位置和右下角位置。且注意,坐标轴 x 轴从上向下延伸,y 轴从左向右延伸。当输入用例n=0时,表示输入终止,该用例无需处理。1≤n≤10000,0≤x1<x2≤100000,0≤y1<y2≤100000注意,本题 n的范围上限加强至 10000。输出:第一行输出”Test case
2020-06-08 18:52:14 186
原创 HDU 1540 Tunnel Warfare (线段树 / 求最大连续区间长度)
传送门题意: 抗日战争时期,华北平原广大地区进行了广泛的隧道战争。一般来说,通过隧道连接的村庄成一直线。除了两端的两个村外,每个村庄都与两个相邻的村直接相连。入侵者经常对一些村庄发动袭击,并摧毁其中的部分隧道。八路军指挥官要求提供隧道和村庄的最新连接状态。如果某些村庄被严重隔离,则必须立即恢复连接!输入:输入的第一行包含两个正整数n和m(n,m≤50,000),表示村庄和事件的数量。接下来的m行中的每行都描述一个事件。下面以不同的格式描述了三个不同的事件:D x:第x个村庄被摧毁。问:陆军司令
2020-06-07 22:43:34 172
原创 POJ 3579 Median (二分套用)
传送门题意: 给N数字, X1, X2, … , XN,我们计算每对数字之间的差值:∣Xi - Xj∣ (1 ≤ i < j ≤ N). 我们能得到 C(N,2) 个差值,现在我们想得到这些差值之间的中位数。如果一共有m个差值且m是偶数,那么我们规定中位数是第(m/2)小的差值。( Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 )**思路:**很神奇的一个题总共有 n * (n - 1) / 2个差值,那么比中位数大的就有 n * (n - 1) / 4个数那么就
2020-06-07 19:19:03 180
原创 Codeforces B. Subsequence Hate (二进制 / 思维) (Round #646 Div.2)
传送门题意: 求出最小删除字符数,以使二进制串s不含有"101"和"010"这样的子串。思路:可以看出,字符串不能出现’0’,'1’交替出现的情况。即只有"1111……",“0000……”,"1111……0000"和"0000……1111"这四种情况。所以用前缀和记录一下’0’和’1’的个数再计算求个min就行啦代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long lo
2020-06-06 11:52:13 293
原创 Codeforces C. Johnny and Another Rating Drop (二进制 / 贪心)(Round #647 Div.2)
传送门题意: 找到0 ~ n 的两两相邻数的二进制数的差异位数总和。思路: 不难看出其实每一位二进制数都有一定规律的。二进制第一位的贡献度为 n / (2 ^ 0)二进制第二位的贡献度为 n / (2 ^ 1)二进制第三位的贡献度为 n / (2 ^ 2)……如此遍历将每一位的贡献度加起来就是答案啦。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#
2020-06-05 13:29:00 247
原创 Codeforces D. Yet Another Yet Another Task (区间和 / 贪心)(Round 88 Div.2)
传送门题意: 有一个区间a,找得到其(最大区间和sum - 区间内最大元素maxx)的最大值。思路: 每次遇到这周大范围的区间和问题就没辙,其实都是些很巧妙的思维因为答案ans的最小值为0,所以只需考虑正整数元素;又因元素max可在[1 ,30]范围,所以可以枚举maxx值,再枚举区间即可。若a[i] > maxx 则不符枚举目的,sum = 0(放弃前面的区间段)若sum < 0则不符最大值 >= 0,sum = 0代码实现:#include<bits/std
2020-06-04 14:44:34 125
原创 Codeforces E. Tree Shuffling (树 & dfs) (Round #646 Div.2)
传送门题意: 有一棵n个节点的树,每个节点都有其a[i]代价,b[i]现有值,c[i]目标值。每次可以选择一个节点x作为根节点,选其子树的k个节点随机排序以得到目标值,消耗k *a[x]。试问是否可以使得整棵树变成目标值,并输出最小消耗;若不行输出-1.思路:用dfs维护一下子树中 0 -> 1和 1 -> 0的个数, 再用minn维护a[i]的最小值。可以知道,若子节点比父节点代价小,那肯定以子节点为根消耗最小,所以用dfs来递归就好啦。若minn == a[i]表示没有比其代价
2020-06-03 15:24:07 166
原创 Codeforces C. Game On Leaves (贪心 / “博弈”) (Round #646 Div.2)
传送门题意: 给你一个n个节点的无根树和一个特殊节点x。Ayush和Ashish轮流在树上进行游戏:找到一个叶节点(度大于或等于零)将其删除(包括以其为端点的边),删除特殊点的就是赢家,且Ayush为先手。输出每个测试的赢家名字。思路: 这道题看起来是博弈,其实就是个贪心的思维题若特殊点就是叶节点则直接先手Ayush赢将特殊点看做根节点,必须删除其他n - 2个点后再看谁是先手谁就是赢家(也就相当于n % 2 == 0则最后一局依旧是Ayush先手,否则就是Ashish赢)。代码实现:#i
2020-06-02 16:57:08 186
原创 Codeforces H. Binary Median (二进制 / 思维)(Round #644 Div3)
传送门题意: 在2^m 个长为m的二进制串(01串)中删除n个,输出剩下k个二进制串序列的中位数([k - 1] / 2 下取整)。思路:找到未删减时的中位数z,因为最多删除100个数,所以再把中位数左右110范围内的数加入答案a区间内。遍历需要删除的区间,因为二进制的字典序和十进制的排序一致,所以将其转换成十进制数x。若x < a[0],说明会在中位数左侧删除一个数,删除a[0];同理当x > a.end()的时候删除a.end();若需要删除的数在a区间内部a[0] <
2020-06-01 07:49:51 322
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人