- 博客(32)
- 收藏
- 关注
原创 CodeForces 1458 Glass Half Spilled B/D 动态规划
CodeForces 1458 Glass Half Spilled B/D 动态规划题目大意:有 nnn 个杯子,每个杯子有容量 aia_iai 和水 bib_ibi,有一个操作可以把一个杯子任意 xxx 单位的水导入另一个杯子,但另一个杯子只能收到 x/2x/2x/2, 另一半将被浪费,也不能超过自己的容量上限,多余也将被浪费。现在选择 kkk 个杯子, 问这 kkk 个杯子最做能有多少水。1≤k≤n1\le k \le n1≤k≤n思路:问了大佬才懂,定义 dp[i][k][c]dp[i
2020-12-22 11:35:50
330
原创 CodeForces 1463 C. Busy Robot 模拟
CodeForces 1463 C. Busy Robot 模拟题目大意:有一个一维坐标轴,在最初时刻有个机器人位于坐标 000 位置,有 nnn 个命令,对于每一个命令在 tit_iti 时刻可以向 xix_ixi 以每秒一单位的距离移动,当机器人在移动过程中,会忽视此时其他的命令。现在定义第 iii 个成功的命令:在 $ [t_i, t_{i+1}]$ 经过 xix_ixi,则说明这条命令是成功的。第 tn+1=inft_{n+1} = \inftn+1=inf被忽视的命令也可能是成功
2020-12-21 21:36:25
287
原创 2020 乐山师范学院程序设计大赛题解
2020 乐山师范学院程序设计大赛题解比赛链接交题要在题库搜索对应的题才能交总结:心态爆炸!!!被 FFF 卡 intintint被 CCC 卡INFINFINF算完 EEE 的复杂度不敢写心态爆炸A: 好数对题意:给定一个长度为 nnn 的 aaa 数组, 如果存在一个下标 i,j,i<ji,j, i<ji,j,i<j 并且 a[i]==a[j]a[i] == a[j]a[i]==a[j],就是好数对。求有多少个这样的数对思路:各种方法都行,直接通过下标计数法
2020-12-19 21:23:07
2364
3
原创 CodeForces 1436 D. Bandit in a City 二分+卡常
CodeForces 1436 D. Bandit in a City 二分+卡常题目大意:给定一个 nnn 个节点的树,树的根节点一定是 111 ,每个节点都有权值 aia_iai,每个节点的权值都要往下分配转移,直到叶子节点,问叶子节点中最大的权值最小是多少.权值可以任意整数分配,但一定要分完。思路:最大最小问题,直接考虑二分,二分节点的最大值,checkcheckcheck 就是跑一遍树,但这题只有 1s1s1s,所以可能卡常解释下各数组的含义:numnumnum 数组表示当前节点可
2020-12-17 14:51:18
162
原创 CodeForces 1454 F. The Treasure of The Segments 排序+二分
CodeForces 1454 F. The Treasure of The Segments题目大意:给定一个有 nnn 个线段的集合,假设集合中有一个线段与其他所有线段有交点,则表示这个集合是好的,问最少删除几个线段可以让集合变好.思路:第一种想法:枚举每个线段 xxx,看看有几个线段和这个线段相交,没有交点的线段自然就删去,记录一个最小值,这种做法就要对按某个端点线段排序,对有序的端点使用二分查找,但对无序的另一端就要使用某些数据结构比如 BITBITBIT 主席树这种。这种写起来就不方便第
2020-12-16 19:55:41
213
原创 CodeForces 1452 D - Radio Towers
CodeForces 1452 D - Radio Towers题目大意:有 nnn 个灯塔,每个灯塔有 1/21/21/2 的概率设一个信号发射器,覆盖长度可以自己设置 xxx, 要求 所有灯塔都要有信号,并且每个灯塔只能被一个信号覆盖,并且不能覆盖到 000 和 n+1n+1n+1。思路:设置 dp[i]dp[i]dp[i] 表示第 iii 个灯塔刚好被覆盖的方案数,答案就是 dp[n]/2ndp[n] / 2^ndp[n]/2n,所以先求 dp[n]dp[n]dp[n] 即可首先 dp[i
2020-12-14 22:27:18
186
原创 CodeForces 1454 F. Array Partition
CodeForces 1454 F. Array Partition题目大意:给一个 nnn 个元素数组,将这个数组划分为三个非空连续连续的区间,使得第一个区间的最大值等于第二个区间的最小值等于第三个区间的最大值。思路:首先分析:求区间最大值最小值,采用线段树之类的,因为没有修改只有查询,写起来也很快,或者用 ststst 表处理更快,但我不会。。。。继续分析,第一个区间一定是前缀区间,第三个区间一定是后缀区间,所以我们就可以从这入手。第一步枚举第一个区间 [1,l][1, l][1,l],求得
2020-12-14 21:32:23
175
原创 CodeForces 1454 E. Number of Simple Paths 树
CodeForces 1454 E. Number of Simple Paths题目大意:给一个 nnn 个点 nnn 条边的联通图,那就是基环树。求简单路径的个数。思路:关键点就在这个环上,如果一条路径 A−BA - BA−B 中间通过了环,那就会有两条路径,如果没有环,那就必然只会有一条路径。那就把环上的节点当作树根,那么这个树上的任意简单路只有一条。所以假设所有简单路径都有两条,然后减去每个树上的简单路径。假设一棵树上的节点有 xxx 个,根据排列组合,那么树上所有的简单路径就是 Cn2
2020-12-14 16:41:30
117
原创 CodeForces 1455 D. Sequence and Swaps
CodeForces 1455 D. Sequence and Swaps题目大意:给一个 nnn 个元素数组,和一个整数 xxx,你可以执行 000 次或者若干次操作。从数组选择一个元素 ai>xa_i > xai>x ,交换 aia_iai 和 xxx 。问最小操作几次能使数组有序,没有答案输出 −1-1−1思路:有一个重要的结论: xxx 一定会越来越大假设 ai>xa_i > xai>x,但是不操作,那么在后面 $a_j > x $ 并且
2020-12-14 16:40:41
141
原创 CodeForces 1461 D. Divide and Summarize
CodeForces 1461 D. Divide and Summarize题目大意:大致意思就是给出一个数组,你可以操作0次或若干次改变这个数组。然后给出 qqq 个查询,问能不能找到一个数组和等于 sss。具体操作就是选取一个 mid=⌊max(array)+min(array)2⌋mid=⌊max(array)+min(array)2⌋mid=⌊max(array)+min(array)2⌋, 然后小于等于 midmidmid 放左边数组,大于放右边数组,选择一个数组代替原来的数组思路:观
2020-12-12 15:44:24
239
原创 CodeForces 1461 C. Random Events
CodeForces 1461 C. Random Events题目大意:给定一个长度为 nnn 的数组,给出 qqq 个操作 (r,p)(r, p)(r,p), 对 [1,r][1, r][1,r] 区间进行有序排序,排序的概率是 ppp,不变的概率自然就是 1−p1-p1−p。问最后数组全部有序的概率是多少。思路:直接算全部有序的概率非常复杂,另一个想法就是这么多操作后数组还不是有序的概率是 PPP, 那么最后的答案自然是 1−P1 - P1−P。这是一个结论题,因为每次都是对前缀操作, 那
2020-12-12 15:43:43
327
原创 CodeForces 1461 B. Find the Spruce
CodeForces 1461 B. Find the Spruce题目大意:就是在矩阵里找有几个符合题目要求的图形,这个图形和等腰三角形感觉差不多啊。思路:直接模拟,枚举每个点都是顶点,用前缀和快速判断代码:#include <bits/stdc++.h>using namespace std;#define me(a, b) memset(a, b, sizeof(a))#define IOS() ios::sync_with_stdio(false), cin.tie(0
2020-12-12 15:43:07
363
原创 P1941 飞扬的小鸟 细节很多
P1941 飞扬的小鸟题目大意:Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。为了简化问题,我们对游戏规则进行了简化和改编:游戏界面是一个长为 nnn,高为 mmm 的二维平面,其中有 kkk 个管道(忽略管道的宽度)。小鸟始终在游戏界面内移动。小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成。小鸟每个单位时间沿横坐标方
2020-12-10 14:02:19
134
原创 P1006 传纸条
P1006 传纸条题目大意:给一个带权矩阵,从 (1,1)(1,1)(1,1) 走到 $(n, m) $,可以向下或向右走,选两条不相交的路,问两条路的最大权值是多少。思路:直接定义数组 dp[i][j][x][y]dp[i][j][x][y]dp[i][j][x][y], 表示当前第一条路走到 (i,j)(i, j)(i,j) 第二条路走到 (x,y)(x, y)(x,y) 的答案,两条路一定要同时走,意思就是第一条路走了多少步,第二条路也得走多少步,那么很明显就由一个等式 i+j=x+yi+j=
2020-12-09 15:55:44
62
原创 P1043 数字游戏
P1043 数字游戏题目大意:给一个由 nnn 个数组成的环,讲环拆成 mmm 份,每份求和最后相乘,求最大/最小值。思路:一道区间 dpdpdp 题,首先因为是环,常规做法就是拆环,用两倍数组装,又要对每份求和,那就需要用到前缀和。数组 dp[i][j]dp[i][j]dp[i][j] 表示将 jjj 个数分成 iii 份的最大/最小值区间 dpdpdp 常规做法枚举分割点 kkk, 那么状态转移方程 dp[i][j]=max/min(dp[i][j],dp[i−1][k]∗sum[k+1,j
2020-12-09 14:20:36
134
原创 P2015 二叉苹果树 树上dp+分组背包
P2015 二叉苹果树题目大意:有一颗树,根是 1 ,每条边上有对应的权值,保留 q 条边,问剩下的权值最多可以是多少,剩下的边一定要和根节点联通。思路:dp[i][j]dp[i][j]dp[i][j] 表示第 iii 个节点保留 jjj 条边的最大权值,那么答案就是 dp[1][q]dp[1][q]dp[1][q]。发现是树上 dpdpdp 的分组背包,每个节点都是对应的组,每个组内的物品有 qqq 个,每个节点的贡献只能计算一次,那就是裸的分组背包第一层循环遍历节点等价于遍历组第二层循环遍
2020-12-08 16:06:55
183
原创 P1103 书本整理
P1103 书本整理题目大意:就是排序之后,从 n 个数里删除 k 个数,使得剩下的数字相邻差的绝对值和最小。思路:想不出状态转移方程,就用记忆化搜索写了,搜索就是好想int dfs(int i, int cnt, int pre){ int res = INF; if(i > n) return 0; if(dp[i][cnt][pre] != -1) return dp[i][cnt][pre]; int d = (pre
2020-12-08 14:26:42
190
原创 P1564 膜拜
P1564 膜拜题目大意:神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.某学校有两位神牛,神牛甲和神牛乙。新入学的 nnn 位同学们早已耳闻他们的神话。所以,已经衷心地膜拜其中一位了。现在,老师要给他们分机房。但是,要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过 mmm。另外,现在 nnn 位同学排成一排,老师只会把连续一段的同学分进一个机房。老师想知道,至少需要多少个机房。思路:dp[i]dp[i]dp[i] 表示安排完第 iii 个同学需要的最少机房, 然后从
2020-12-07 21:50:12
151
原创 P5662 纪念品
P5662 纪念品题目大意:小伟突然获得一种超能力,他知道未来 TTT 天 NNN 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;卖出持有的任意一个纪念品,以当日价格换回金币。每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。TTT 天之后,小伟的超能力消失。因此他
2020-12-07 17:15:56
120
原创 P2858 [USACO06FEB]Treats for the Cows G/S
P2858 [USACO06FEB]Treats for the Cows G/S题目大意:有一个双端队列,每次取元素只能从头或者尾巴取,第 iii 次取元素 xxx 的贡献是 i∗xi*xi∗x, 问取完最大的贡献可以是多少思路:设 $dp[j][k] $ 表示左边取了 j 个右边取了 k 个的最大贡献,那么对于 $ j == 0$ 和 $ k == 0$ 时的状态转移方程,iii 表示取第几个元素, 要满足 j+k=ij + k = ij+k=idp[i][0] = dp[i-1][0] +
2020-12-06 16:27:29
145
原创 P1470 [USACO2.3]最长前缀 Longest Prefix
P1470 [USACO2.3]最长前缀 Longest Prefix题目大意:给定一个集合 PPP,任意使用 PPP 中的元素,问能拼出目标串 SSS 的最长前缀是多大思路:定义 dp[i]dp[i]dp[i] 表示 前缀 iii 是否可以拼成,那么枚举 iii ,然后再枚举集合元素 ttt,状态转移:if(i >= t.size() && dp[i-t.size()] && s.substr(i-t.size(), t.size()) == t)
2020-12-06 15:40:12
242
原创 CodeForces 1453 C. Triangles
CodeForces 1453 C. Triangles题目大意:给一个矩阵,每个元素都是 1−91-91−9,对每个 ddd,选三点都是 ddd 的,问组成最大的三角形面积多大,每个 ddd ,都可以把一个数字改成 ddd,然后算完在改回去。ddd 是 1−91 - 91−9 遍历的思路:记录每个数字的最大行最小行,最大列和最小列。然后枚举每个位置,用刚记录的算,具体看代码理解代码:#include <bits/stdc++.h>using namespace std;#def
2020-12-05 21:22:52
322
原创 CodeForces 1453 D. Checkpoints
CodeForces 1453 D. Checkpoints题目大意:构造一个序列,111 就是当前关卡的存档点, 000就不是, 给一个 kkk, 怎么构造关卡序列使得所有关卡的期望等于 kkk, 每个关卡的通过率是 12\frac 1 221思路:思考后发现:111 的关卡的期望一定是 222,问题就在 000100010001 这种上面,在 111 这个关卡上一定要 222 次,那 111 前面的 000 就要 444 次,因为 444 次机会才会有两次机会通过,这两次机会才能通过后面的 1
2020-12-05 21:22:14
316
原创 CodeForces 1453 B. Suffix Operations
CodeForces 1453 B. Suffix Operations题目大意:给定一个数组,每次操作可以选择一个后缀全部加一或者全部减一,你有一次机会改变一个数字为任意的,问最少需要多少次操作能让数组元素全部一样。思路:因为每次只能操作后缀,就很自然想到从后开始操作,想让 ana_nan 等于 an−1a_{n-1}an−1, 然后等于 an−2a_{n-2}an−2, 一直下去,算一个后缀和,这就是不用机会的最小值。之后枚举每一个位置,对于中间 $ 1 < i < n$ 的位
2020-12-05 21:21:44
151
原创 2020 乐山师范学院新生程序设计大赛题解
2020 乐山师范学院新生程序设计大赛题解A 数组求和中等难度题目大意:给定一个数组,执行若干次操作,每次操作可以把两个相邻的数变成相反数,求数组最大的和。解题思路:这其实是一个思维题,认真思考会发现,最大和,肯定希望数组中的负数是最小的,最好全都是非负数。基于这个思想,会发现,经过若干次操作后,可以让负数的位置自由移动。例如 n=5,−5,4,3,2,1n = 5, {-5, 4, 3, 2, 1}n=5,−5,4,3,2,1,第一次移动选择下标 1,结果就会变成 5,−4,3,2,1{5,
2020-12-05 17:06:00
643
原创 CodeForces 1457D XOR-gun
CodeForces 1457D XOR-gun题目大意:给定一个长度为 nnn 的非递减数组,你每次操作可以选择两个相邻的数异或代替原来的数,数组长度减一,问最少需要多少次才能让数组不再递减,无答案输出 −1-1−1.思路:想了很久,就只想到两个相邻的数最高位相同的话,异或肯定是会变少的,但没想全,最后看题解才发现游三个最高位一样,肯定操作一次就可以了,所以这个数组长度不能超过 606060 ,超过了答案一定是 111 。为什么是 606060 呢,因为第一位最高可以有 222 个,第三十位最高可
2020-12-02 21:10:25
303
原创 CodeForces 1457B Repainting Street
CodeForces 1457B Repainting Street题目大意:给定一个长度为 nnn 的数组,你每次操作,可以选择一个长度为 kkk 的子区间,并随意更改子区间元素的值, 问最少几次操作可以使得数组所有元素相等思路:一道模拟暴力的题,也算水题。因为数组元素范围在 [1,100][1, 100][1,100], 所以暴力最后相等的元素,然后算操作次数,取最小值即可。算操作次数方法:假设最后数组全部等于 xxx,那么当 a[i]≠xa[i] \not= xa[i]=x,就可以
2020-12-02 20:21:30
89
原创 CodeForces 1457C Bouncing Ball
CodeForces 1457C Bouncing Ball题目大意:给定一个 010101 串,有一个小球落到 ppp 点, 然后往前跳 kkk 步,一直跳下去直到跳出串的长度,小球只能落到 111 上面。你可以花费 xxx 秒把一个 000 改变成 111,或者花费 yyy 秒删除第一字符,然后其他字符往前移动一个单位。问你最少需要多少秒才能保证小球可以跳出字符串。思路:看到这题就立马想到了 dpdpdp,然后就构思状态转移方程,一开始是构想 dp[i][0/1]dp[i][0/1]dp[i]
2020-12-02 20:02:21
214
原创 HDU6148 Valley Numer
HDU6148 Valley Numer题目链接题目大意:思路一道很明显的数位dp,不能出现先增后减这种情况,并且前导0是不合法,所以都需要额外的标志记录状态代码#include <bits/stdc++.h>using namespace std;#define me(a, b) memset(a, b, sizeof(a))#define IOS() ios::sync_with_stdio(false), cin.tie(0)#define endl '\n'typ
2020-12-01 20:28:00
95
原创 HDU3652 B-number
HDU3652 B-number题目链接题目大意:一个数字如果含有 13, 并且是13的倍数,那么这个数字就叫 wqb-number问 1−n1 - n1−n 以内有多少个这样的数字思路一道很明显的数位dp,设置一个变量来标记是否出现了13,而怎么判断是否是13的倍数,可以传递余数,利用同余的性质来进行判断。代码#include <bits/stdc++.h>using namespace std;#define me(a, b) memset(a, b, sizeof(a)
2020-12-01 19:58:28
131
原创 HDU 2089 不要62
HDU 2089 不要62题目链接题目大意:给定一个区间,求区间有多少个数满足下列条件:数字没有出现连续的 62数字中没有出现 4有多组测试数据思路:直接暴力模拟是超时,因为有多组。这题也是数位dp的一道简单题, 所以可以直接数位dp做代码:#include <bits/stdc++.h>using namespace std;#define me(a, b) memset(a, b, sizeof(a))#define IOS() ios::sync_with_
2020-12-01 15:38:33
106
原创 hihoCoder #1033 交错和
hihoCoder #1033 交错和题目链接 #1033交错和题目大意: 题意很清楚,就是求区间满足条件的数字的和思路:- 这是一道数位dp的题目- 注意返回值,因为要算数字和,所以在进行 $dfs$ 搜索时,要返回两个值,一个是满足条件的个数 $n$ ,一个是满足条件的总和$sum$,所以当前位置的贡献就是 当前填的数乘上个数,累加取模即可。- 要注意前导 $0$ ,因为前导 $0$ 会影响状态- 具体可以看代码代码:#include <bits/stdc++.h&
2020-12-01 13:10:58
114
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人