对于代码和题目详见百度网盘,这只讲思路
1,这道一看,显然会以为是一个前缀和(因为这一道题和累加和差不多),但是这一道要求的是平均数,所以我们可以向把平均数转换成求和就行了(可是我就是没想到),于是看到了数据范围(1<= ai <= 5000)很容易就能想到二分这么一个东西。所以我们可以二分枚举平均数,用一个数组来记录减去平均数后的值,求一遍前缀和。
这样我们的问题就变成了如何求解一段区间里的最大值,然后用返回是不是大于0就行了。
但是如何求解这一段区间的最大值呢?我们可以发现这么一个求最小值得东东:Max=max{sum[i]-sum[j]}(k<=i<=n&&j+L>=i)
那么我们在枚举i得时候,就可以顺带求出j,可以详见蓝书中的Best Cow Fence
2,这是一道很恶心的问题,首先这种想法根本就想不到(至少现在不行),那我们现在就讲讲正解。
首先,我们要把这一个曼哈顿距离就变成了切比雪夫距离(我也不知道是啥)。把坐标系旋转45度,就可以求解出一个东东。下面是互相转换的公式:
将一个点(x,y)的坐标变为(x+y,x-y)后,原坐标系中的曼哈顿距离 =新坐标系中的切比雪夫距离
将一个点(x,y)的坐标变为((x+y)/2,(x-y)/2) 后,原坐标系中的切比雪夫距离 = 新坐标系中的曼哈顿距离
然后我们发现所有棋子都被一个大矩形框起来了,那么最后划分为的点集必定分别被对角的小矩形框起来
(对于这一个大矩形的坐标,就是横,纵坐标的最大最小值组成的一个矩形)
因此我们可以贪心的决定每个棋子所属的小矩形
对于方案数,我们只需要枚举每一个点,如果这一个点的转换小于最大值,就说明两边都行,就可以*2
T3,由于我太菜了(或是出题人的毒瘤),所以至少现在我还是不会,就不写了......