感谢东子,第一次笔试ak,前两题代码没存
没啥好说的,区间排个序判一下是否相交即可,选的两个数一定是一样的,第一次交的时候过了70,想了想发现是没判第一个和第三个区间,改了后过了
二分每个商品价格最接近的折扣劵即可,不知道折扣的数据是不是非递减的,但我还是把排序后的每一个折扣的满减线与前一个满减线的折扣取了个max,防止满1000元减5元,满100元-50元的情况出现
# 回忆版 def solve(): n, m = map(int, input().split()) a = list(map(int, input().split())) s = [] for i in range(m): s.append(list(map(int, input().split()))) s.sort() for i in range(1, m): s[i][1] = max(s[i][1], s[i - 1][1]) d = defaultdict(int) for i in s: d[i[0]] = i[1] ans = 0 temp = sorted(i[0] for i in s) for i in range(n): pos = bisect_right(temp, a[i]) if pos == 0: ans += a[i] else: ans += a[i] - d[temp[pos - 1]] print(ans)
基础不牢,地动山摇。看数据范围一眼O(mnlog(min(m, n)), 应该是需要个二分,想了一个多小时怎么在二维数组里面二分,忘了,半天没想出来,最后半小时决定先把骗分的写上,快速敲完发现py写O(mn * min(n, m))能过26,后来又交了遍过了23(评测机还是一如既往的抖,不过也有可能是py的锅),正当我打算换python3并且加一点读入优化交一遍的时候,发现把最后一层循环起始点(正方形的边长)换成n // 2能过93,大惊,又试着卡了卡数据,就。。。全过了。。数据太弱了,你还我一个多小时的光阴
def solve(): n, m = map(int, input().split()) a = [] for i in range(n): a.append(list(map(int, input().split()))) s = [[0] * (m + 1) for _ in range(n + 1)] # 按主对角线编号,以(1,m)为第1号,每个格子属于第abs(i - 1) + abs(j - m) + 1号 for i in range(1, n + 1): for j in range(1, m + 1): s[i][j] = s[i][j - 1] + a[i - 1][j - 1] for i in range(1, n + 1): for j in range(1, m + 1): s[i][j] += s[i - 1][j] tot = s[n][m] # for i in range(n + 1): # print(*s[i]) ans = 1 << 64 for i in range(1, n + 1): for j in range(1, m + 1): for k in range(max(m // 2 - 10, 0), min((n - i), (m - j)) + 1): ii = i + k jj = j + k if k == 0: ans = min(ans, abs(a[i - 1][j - 1] - (tot - a[i - 1][j - 1]))) continue res = s[ii][jj] - s[ii][j - 1] - s[i - 1][jj] + s[i - 1][j - 1] ans = min(ans, abs(res - (tot - res))) print(ans) solve()
注释是原来的思路,想了半天没想出好的处理方式
#我的求职思考#