第一题:
题目大意:给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。 N<=100000
1.考虑到一个符合要求的连续子序列中,比b大的数的个数和比b小的数的个数相等。对于一个符合要求的区间[L,R], 设[L,pos_b-1]中比b大的数有x1个,比b小的有x2个,区间[pos_b+1,R]中比b大的有x3个,比b小的有x4个,那么肯定满足x1-x2==x4-x3。
2.处理出满足x1-x2=x的区间[L,pos_b-1]的个数存在Left[x]中,同理处理出满足x4-x3=x的区间[pos_b+1,R]的个数存在Right[x]中,那么ans=sum{(Left[i]+1)*(Right[i]+1)}.
初始得分100
第二题:
题目描述:
在一个凹槽中放置了n层砖块、最上面的一层有n 块砖,从上到下每层依次减少一块砖。每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示:
规定最上面的为第1层,最左边的是第一块砖。
如果你想敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它;若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖。
你现在可以敲掉最多m块砖,求得分最多能有多少。 1≤n≤50,1≤m≤500
解题过程:
1.考虑到某块砖头能否打掉,和它右边那一列的状态有关,所以规定打的顺序是从右往左。状态表示三维,一维是打到第i列,一共打了j个砖头,且第i列打了k个的最优解。转移枚举右边那一列(第i+1列)打了多少砖头。。
2.时间复杂度O(N^3*M),初始得分80,没有处理好边界。
第三题:
题目描述:给出了一张有N个点M条边的加权有向无环图,接下来有Q个询问,每个询问包括2个节点X和Y,要求算出从X到Y的一条路径,使得密度最小(密度的定义为,路径上边的权值和除以边的数量)。
1≤N≤50,1≤M≤1000,1≤W≤100000,1≤Q≤100000。
解题过程:
1.看到N的范围比较小,那肯定是和Floyd有关系的算法。。因此改造一下Floyd,F[i][j][k]表示i到j经过k条路的最短路。
F[i][j][k]=min{F[i][p][k-1]+F[p][j][1]};
2.初始得分30. 被 询问(x,x)坑掉了,应该输出"OMG!",我输出的是0.