SCAU2022春季第一场

 

2022春季第一场

A

题意:现在银行有n堆宝石按顺序排列,每堆宝石的个数为ai。银行在间隔m秒之后会检查一下相邻两堆宝石的加和有没有改变,如果改变了就会报警。问你在k次m秒之内,最多能偷取多少的宝石。

题解:先模拟一下把第一堆移动一个到第二堆。这样第一堆和第二堆的总和不变,但是第二堆和第三堆的总和加了一,如果这时候第三堆后面没有宝石了的话,我们就可以把第三堆中偷走一个,使得系统不会报警。但如果第三堆后面有第四堆的话,我们就必须把第二堆左移一个或把第三堆右移一个才不会报警,我们不会尝试把第二堆左移一个,如果这样做的话前面第一步就白干了,所以我们就会把第三堆右移一个。这时候我们来到第四堆,发现了和前面一样的情景,如果后面是一个就能偷了,要不是一个就要继续右移,这样下来发现总是把奇数位的移动到偶数位,然后把最后一个奇数位的宝石偷掉一个。

这时写程序就直接判断偶数不能偷,奇数就偷最小的奇数位置ans1,每一轮最少要(n/2+1)秒才能偷掉一个。

ans=min(ans1,m/(n/2+1)*k)

B

 

题意:给定一个n,问你有没有对应的x构成上述等式。

s(x)是x各个数位的数字之和 s(123)=6 s(111)=3 s(100)=1

题解:n的范围是longlong 所以x的范围不会超出int 这样枚举还是范围太大,考虑s(x)函数,最大范围也不超过一 百,然后求出对应二次函数的解,看对应的解符不符合s(x)即可。

赛时我用二分做的,缩小了一个范围里面暴搜,别人都是30ms我用了124哈哈。

C

题意:给定n个数,n个数的乘积为分子,给定m个数,m个数的乘积为分母。

要求你化简这个分数,然后把这个分数的分子和分母用数字的乘积表示出来。

要求数量不能超过原来的数量而且输入输出数字大小不能超过1e7

题解:对于小的质数直接暴力枚举,然后我们把这些质数出现过的位置保存起来,枚举完小的质数以后,如果剩下的数还是一个质数,也要把它保存起来。

我们先暴力扫一遍a,把每个元素的质因子都存起来,然后我们遍历b数组,如果有对于的质数存在的话,就把b除掉这个质数,然后保存的质数pop掉一个。

最后我们把a数组重置成全1的数,然后遍历所有的质数数组,把还没消掉的归回原位置。

D

题意:给一个n,然后有一个长度为n的数组,偶数为蓝色奇数为红色,问你有多少种子序列让相邻的颜色不同。(子序列可以通过删除数组中的某个数来得到)

题解:例如 1010 可以有11中 (1)(0)(1)(0)(10)(01)(10)(10)(101)(010)(1010)

我们定义a为最后用0结尾的子序列数量,b为最后用1结尾的子序列数量。

如果我们这次来的是1,那么答案ans加上a+1,然后用1结尾的b要加上a+1.

如果我们这次来的是0,那么答案ans加上b+1,然后用0结尾的a要加上b+1.

E

题意:给定三个人种数量a,b,c,每次战斗失败的一方会死掉,赢的一方会变成没有参与战斗的一方。

例如ab战斗,赢的人就变成c。问最小多少场战斗可以让所有人变成同一种人种。

题解:可以发现要变成同一人种的话,就需要有两个一样数量的人种不断的战斗,赢的变成第三个人种。

假设a<=b<=c的话,那么如果ab同奇偶,那么答案数最小可为b,因为我们可以不断通过两轮战斗来使得b的人数变成a,然后最后在把ab消掉即可。如果ab不同奇偶的话,那么答案就是c了,由于容斥原理必定有a和b中有一个和c同奇偶,然后不断的让c接近a或b最后消掉c和a或b即可。

F

题意:给定两个队伍在打dota,然后有n个英雄的战斗力(1<=n<=100),m次bp(1<=m<=20),这m次bp都规定了当前操作的队伍而且b或者p也给定,问你在两个队伍都足够聪明的情况下,最大化队伍1-队伍2的战斗力。

题解:由于状态比较小所以考虑状压dp,这里定义dp[i]为状态为i的情况,1表示已经选择,0表示没有选择。

如果是第一队则转移到maxdp[i],第二队就转移到mindp[i]。

这里有个点,我们到倒过来dp,即是dp[1]表示最后一次选择的队伍,这样反过来就能在dp的时候得到后面的最大最小值,这样我们能由后面的最大最小值来得到我们目前能整一个什么活来使后面选择那个大的或小的。

这里可能有点难懂,比如你选择第一个的时候,你这时候应该知道选这一个之后剩下的全部选会有什么结果,然后根据这些不同的结果你就能推断出来当前选什么是最优解。

G

题意:给定一个n,m次操作,每次操作给一段l~r加上x或者查询到l~r的最大值为x,问你能不能构造出初始序列。

我们正这做,定义t[i]代表第i个数修改的总值,然后在询问到l~r时,我们要通过已经修改过的值来推算初始值的最大值。例如一个数字目前+9,然后查询到包含这个数字的区间的最大值为10,那么这个数字的初始值最大值为1

我们不断的最小化这个值,把他当成最后的答案,再次推理。

在这m次操作中不断修改,如果查询到的最大值不是操作中查询的最大值,那么就表示没有存在这样的初始序列。

对于没有操作过也没有询问过的数字,随便给个范围内的值即可。

H

题意:给定n个数,并且给每个数字到其它数字的距离,问是否有一颗树,满足给定的距离。

题解:我们直接用所给的边跑出一棵最小生成树,因为如果边要构成一棵树的话肯定是用这些距离来生成最小生成树,用别的边会生成环。

然后我们用最小生成树跑最短路,然后看能不能匹配上给的距离就行了。

I 2800分,先留个坑

J

题意:给定n个数字两两不同,有两个人共进行三个回合,每个回合谁抽到的数字大谁取得胜利(抽完放回),问三局回合抽到总和大但却输掉比赛的几率。

题解:由于n比较小,我们n2处理出两两的差值,然后发现要总值大至少要赢一把,然后我们定义dp[i]为前两把赢了i分的情况,然后答案就是每个差值 i*dp[i-1],然后除以总组合数C(n,3)得到答案。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值