Code人心弦(高级组)

Problem A: CZ Loves BracketSequence

题意:给你括号序列,问你最多的连续匹配是多少,只有小括号

题意:用栈存,栈里的是还没匹配的,匹配的就出栈

然后每次匹配成功之后,就把当前的位置减去栈里还未匹配的栈首元素的序号,注意边界

AC代码:http://paste.ubuntu.net/13883463/


Problem B: CZ loves String I

题意:把字符串重新排列,输出前k个最小的字母

题解:直接字符数组排序。


Problem C: Dark elf and Light elf

题意:给你2n个两种不同的精灵,n个n个分开关,然后两个房间,每次可以打开一个房间,就会放走一个精灵,当有一天打开房间发现里面没有精灵的时候,求另外个房间的精灵的个数的期望,给你打开第一种精灵房间的概率

题解:概率题,推公式,首先考虑第二个房间有n个精灵,期望是nC(n,0)*p^(n+1),有n-1个精灵,期望是(n-1)*C(n+1,1)*p^(n+1)*(1-p)

公式就是∑(n-i)*C(n+i,i)*p^(n+1)*(1-p)^i+∑(n-i)*C(n+i,i)*(1-p)^(n+1)*p^i;

但是这个组合数C(n+i,i)特别大,会爆炸

这里用到个不错的技巧,是log对数优化,C(n,m)=n!/(m!*(n-m)!)

取logC(n,m)=logn!/(m!*(n-m)!)=logn!-logm!-log(n-m)!

于是可以打表求logn!,logn!=log(n-1)!+logn

这样就不怕爆炸了啊,就能很容易的解决这个问题了,p^n也能用log解决,然后算完之后取个exp就OK了

AC代码:http://paste.ubuntu.net/13883696/


Problem D: Monkey and Flag

大模拟,好烦,不想写QAQ


Problem E: Destroy or Rebirth

题意:m次闪电,扣n点血,每次扣血0-n

题解:不定方程x1+x2+。。。+xm=n

C(n+m-1,m-1),快速幂搞一下

如果n==0,m==0,就是输出1,坑了一次

需要敏锐的看出这题是个不定方程,就好做了

AC代码:http://paste.ubuntu.net/13883818/


Problem F: the Route to Legend

题意:给你一些牌,然后有3个属性,法力消耗,攻击,防御,如果一张牌比另外张牌,法力消耗大于等于,攻击防御小于等于的话,就要扔掉,问最多可以留下多少牌

题解:这题一开始以为是瞎排序瞎搞,但是仔细一想,先给他们按照法力值消耗升序排序,攻击,防御降序,这样前面的肯定不会被后面的剔除,然后怎么考虑呢,后面的牌法力消耗都是大于等于前面的,那么如果他攻击防御都小于前面的里面最大的,那么他就被剔除了,所以要在攻击比他大的里面找防御最大的,线段树可以不错的解决这个问题,按照攻击值域插入线段树,每次考察一个随从的时候,先从他的攻击-10W的区间内,找最大值,如果这个最大值(就是比他攻击高的随从里面防御最高的)大于等于他的防御,那么就continue,否则ans++并且update

AC代码:http://paste.ubuntu.net/13883965/


Problem G: CZ loves Candies

题意:给你很多糖果和总容量,然后给你每个糖果所占的空间和甜度,要求甜度最大

题解:这个就是01背包,但是20W的空间10W的数量,这药丸啊,但是后来发现每个糖果的空间都只有1和2,所以可以直接按照糖果甜度的平均值排序,然后一个个取,取到最后如果最后的空间正好没了,就最优,如果最后多1个空间,但是下一个糖果的空间是2,那么就要看看前面有没有取过1的糖果,后面有没有1的糖果,然后分4种情况讨论。

AC代码:http://paste.ubuntu.net/13884015/


Problem H: CZ loves Math

题意:给你很多数,然后把倍数在1-v里面筛掉

题解:直接筛就行了,开头虚了以为会T,其实只要特判1的情况,然后标记重复出现,复杂度就是n*(1/1+1/2+1/3+.......+1/n)的复杂度了


Problem I: The second blood

题解:打表,数组记录水题


Problem J: CZ loves GCD

题意:给你10W个数字,然后10W次询问,区间内和v互质的数的个数

题解:一般这种题目都是容斥,但是这题要离线搞,我由于没怎么写过离线的导致比较虚,我的锅

离线后区间排序,这题的区间给的比较人性,然后就是每个数字进队出队的过程,考虑每个区间,然后没进去的数字进去,不用进去的数字就出来,然后开个数组,存每个数字他的素因子,然后容斥,记录他是哪些因子的倍数,各种++--,然后考虑当前数组的v,容斥分解之后,++--搞定

因为考虑一个数字吧,如果他是2,3的倍数,就在f[2]++,f[3]++,然后f[6]++,然后v如果是2的话就-f[2],如果是3就-f[3],如果是6就-f[2]-f[3]+f[6],所以这样搞是可以的,不要用vector,会跑的比较慢然后T了

AC代码:http://paste.ubuntu.net/13884166/


Problem K: CZ loves String II

题意:给你两个串,并列放,然后你可以删除几列,是两个字符串同时删除那列,然后让字典序最大

题解:这题贪心比较复杂,反正是WA了好久,然后感觉用dp瞎搞吧,答案字典序最大的情况下,dp1[i][j]表示前一个字符串的第i位放进去,然后长度为j的时候的字符串,dp2[i][j]表示后一个字符串第i位放进去长度为j的字符串,然后ans=max(ans,dp1[i][j]+dp2[i][j]);

这种题目贪心特别复杂,但是dp完全就瞎搞很容易就出来了,哎以后比赛的时候如果贪不出,得要注意变换方法

AC代码:http://paste.ubuntu.net/13884241/



Problem L: CZ loves DAG

题意:给你一个DAG图,然后考虑图里面任何两个节点u,v,需要两者之间所有路径距离都相等

题解:标程是带权并查集,确实这题带权并查集貌似轻松秒杀

但是比赛时候没想到,就想了DFS,就是如何建图的问题了,想要让搜的次数尽可能少

如果是有向图,那么难免要从每个入度0的点开始搜,就复杂度比较大,所以可以建反向边,搞成无向图,但是权值要变成负,这样的话,如果从u-v,权值为a,但是从另外条u-f权值为b,v-f权值为b-a,反向边的话f-v权值a-b,这样的话就算有两条到v的边,距离也是相等,所以可以让每条边只搜一次,就能很快的解决了

AC代码:http://paste.ubuntu.net/13884347/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值