二模07day2解题报告】的更多相关文章

T1.采药(medic) 有n个草药,要在m的时间内获得最大价值. 乍一看像是01背包,然而数据只能过50分. 考虑数据范围,t<=10,w<=10,所以只有121种草药.考虑多重背包的二进制优化,先统计每种草药的数量,然后可以拆成1,2,4,8--个草药(捆绑成一棵)然后就01背包 T2.方格取数(matrix) N*m的矩阵,从左上走到右下,走法不解释,将格子内的数相乘,求末尾0最少的个数. 考虑拆分,0的个数和2,5的个数有关,所以分别dp 2,5的最小值再取最小值即可.F[i][j]=…
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复杂度比较高(nlogn)的算法.首先按h排序(从高到低),作为算法的一个"输入"序列(记为A)(标记原来位置). 在保存这个序列的基础上,记录rank=1~n,然后按pos排序.排完记为B序列.这时会生成一个关于pos对应h的rank序列,对应B中的每个元素在A中的位置. 用next[i]…
注:Index数☞由4,7组成的十进制数. T1.全排列(permutation) 求n个数的第k个排列中,有多少个Index位置上是Index数. 由于k的范围比较小,n的范围比较大(都是109),所以从k入手,发现只要对后13位进行考虑即可(12!<109<13!). 由于数字可能很大,所以对后13位数据缩小处理(1~13,之后变回来就好了).这道题就变成了13个数的第k个排列问题.这个康托逆展开还是比较好写的(别忘了k- -再处理).然后对后13位统计index 个数,加上预处理的n-1…
T1.笨笨玩糖果(sugar) 有n颗糖,两个人轮流取质数颗糖,先取不了的(0或1)为输,求先手能否必胜,能,输出最少几步肯定能赢:不能,输出-1. 一开始天真的写了一个dp,f[i]表示i颗糖最少取几次能赢或输.然而这个是错的,从对手的角度来讲,他如果必败,一定会选择让对手尽量输的晚一些.否则的话3次以内游戏肯定结束了. 所以可以用dfs套着dp,不能赢的最多步数存为负,能赢最少步数存为正,然后对每个i进行dp,分别用两个变量来保存上述两个值,在判断是否能必胜. T2.笨笨的宇宙蘑菇(mush…
T1.音量调节(changingsounds) 有n个物品的背包(有点不一样,每个物品必须取),给出初始价值,物品价值可正可负(就是两种选择嘛),求可能的最大价值,不可能(<0或>maxsound)输出-1. 很简单的,f[i][j]表示的是到第i首歌时音量为j是否可能. f[i][j]=f[i-1][j-c[i]]||f[i-1][j+c[i]]  (j-c[i]>=0,j+c[i]<=maxsound) 不贴代码啦. T2.旅行(journey) 有n*m的矩阵由'.'和'X'…
T1.合并序列(minval) 给出长为 n的AB两个序列求两两相加中最小的n个. 据说有证明(在蓝书上,优先队列部分)先把A[1~n]+b[1]入队,然后每取一个a[x]+b[y]就把a[x]+b[y+1]入队,取n个即可. T2.抓犯人(catch) 给出T组数据,每组n个点m条边判断是否为二分图. 用dfs染色判断,但是直接染色可能会被卡掉,所以要剪枝.如果采用bfs判断会好一些....其实呢,用can[i][j]表示第i个城市能否在j(0或1,表示奇数偶数).然后只要判断每个城市的can…
T1.砍树(cuttree) 给出n棵树,要锯下m米木材,现在有一个高度h,h以上所有木头都砍下来,求满足m米的最小h 很简单的二分答案判断可行性. T2.快速求和(quicksum) 给出数字串s,要在其中加上一些加号,然后按正常表达式计算,求得到值n的最小添加数,如不能输-1. Dp(虽然std打的是dfs,但我是用dp AC的).F[i][j]表示前i个数中和为j的最小添加数,f[i][j]=min{f[i-k][j-num[k+1][j]]+1}.(好像和我程序里写的不太一样但是效果应该…
T1.笨笨与电影票(ticket) 有n个1和m个0,求每个数前1的个数都大于等于0的个数的排列数. 非常坑的一道题,推导过程很烦.首先求出所有排列数是 C(n+m,m),然后算不合法的个数. 假设存在一个排列,1100011010,由5个1和5个0构成,但是从第5位开始是不合法的.如果把6~10位取反变成1100000101,就变成了n-1个1,m+1个0的一种排列.所以不合法的排列为 C(n+m,m-1) 但是这是不够的,因为这样会存不下(即使压位),所以需要另一种算法的辅助. 先对阶乘中的…
T1.淘汰赛制 比赛时的淘汰赛制,给出每两个球队比赛的胜率,求出最终胜率最高的队伍. 这题的概率真的很难算啊感觉...一开始打的代码打下来就是用f[i][j]表示i场比赛后第j人还在场的概率.不难看出这是一棵树形的状态树 那么可以看出,每次比较的区间长度是2n,那么可以通过枚举左端点来确定区间.确定区间后,f[i][j]=f[i-1][j]*sum(f[i-1][k]*a[j][k]) T2.种树(trees) 有长度为n的区间,有h个要求,每个要求为[b,e]内至少标记t个数,求最少标记数.…
T1.种树(tree) 有n棵树,各有高度,要求每棵树的高度都小于它到其他树的距离(可能种一起).求砍掉的总高度是多少. Ok,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了.所以只要按pos排个序,去重,然后一棵一棵砍,就好了. T2.统计方案(count) 有n个数,取出一部分,相乘mod p=c,求方案树. 还是暴力求解.... 正解是非常神的.由于16的数据是可以比较快的解出来的,所以就可以把所有可能达到的值全都算出来. 然后可以用类似的办法求出另一组中的可能积b…