复盘|2022年度杭州未来科技城数字经济人才编程大赛
信号接收
【排序】题意就是所有发射源发出的信号区间不能重叠。遍历,比较前一个的右端点和这一个的左端点。
黑白棋游戏
【滑动窗口】1的总数是几,窗口大小就是几。扫一遍,求窗口内1的最多个数(相当于求最少交换0的次数)。
快递中转站选址
【中位数贪心】选的x和y互相独立,可以将二维问题转化为两个一维问题,abs(x - x1) + abs(y - y1) + abs(x - x2) + abs (y - y2),分组x一组y一组,abs(x - x1) + abs(x - x2) + abs(y - y1) + abs (y - y2)。找所有x的中位数,以及所有y的中位数,(x,y)就是中转站坐标,然后再遍历一遍,求每个1到中转站的距离总和,即为ans。
c++可以把O(nlogn)的排序换成O(n)的nth_element,写法:nth_elment(xs.begin(), xs.begin + xs.size() / 2, xs.end());
门店商品调配
【子集状压 DP】dp[i]表示集合i通过商品调配后所有元素值均为0最少需要调配商品的次数。用二进制枚举i的子集k和补集i ^ j,if sum[j] == 0可以转移。dp[i]至多是i.size() - 1。分治,大问题可拆成两个小问题,dp[i] = min(dp[i], dp[j] + dp[i ^ j])。特殊情况,sum[i] !=0非法, dp[i] = INT_MAX / 2。(c++的__builtin_popcount可以计算1的个数)
【DFS】暴搜,每次消一个最小的商品。