口胡:模拟题,数据和题意灰常清楚。
俩层循环枚举每个3﹡3的小矩阵,然后枚举每个小矩阵,12个if判断俩俩相邻的字符是否相等。这里有个技巧:拿出中间的字符,这样就能使用一个偏移量数组,dx[8],dy[8],可以减少很多if判断。判断每个小矩阵就是下图这样:
时间复杂度:O(n*n)
口胡:思维题。注意数组是一个排列,每个数只出现一次。
画一下应该就能出来:重复最小的数和最大的数相邻。
比如n等于8:1 8 2 7 3 6 4 5 权值为1
n等于5:1 5 2 4 3 权值为1
代码大概是下面这样:
口胡:[有个想法不知道对不对]
先不考虑操作次数最小,只考虑众数的次数最多。
因为每次操作,对某个数加一,对另外一个数减一,这样相对于总数组的和还是不变的。所以从数组总和开始考虑:对数组中的所有数求和,然后除以数组的元素个数。
这就有俩种情况:
也就是整个数组在操作后每个元素都是一样的。
求出操作完之后应该变成的值,也就是sum/n。
假设x等于sum/n
那最小次数就是对abs(x-a[i])求和 然后除2
对sum/n向上取整,假设是x
操作后的元素是 (n-1)个x 和 一个特殊的数(拿总和减去(n-1)*x)
操作次数的话也就迎刃而解了。
口胡:应该是考察二维前缀和
因为只能切一刀,总共的可能性就是(n+m-2)刀
横着枚举每一刀取min
竖着枚举每一刀取min
因为预处理二维前缀和复杂度是O(n*n),枚举横刀是O(n),竖着也是O(n),所以总时间复杂度是(n*n)
还打印了几道牛客的题
口胡:从后往前预处理dp数组。
dp[j][i]表示从最后一个位置到第i个位置字符j的个数。预处理之后,就可以从前往后开始枚举处理答案了[有可能爆int]。
刚好要下课了 以上解法都是口胡(o。O),晚上自习去验证,如有一些错误,下期会纠正这期的解法。