CCF-CSP202112-2-序列查询新解(Python) 70分暴力 分段 满分实现

  • Post author:
  • Post category:python




202112-2-序列查询新解



问题

image-20230312135848097
image-20230312135900443

image-20230312135919278

image-20230312144637993



思路

按202112-1-序列查询分段思想,

遍历序列A:

  • f(i)分段,隔段f(i)+1
  • g(i)分段,隔段g(i)+1



实现



思路1:直接遍历所有i,规模N到10的九次方

n, N = map(int, input().strip().split()) # n, N两个正整数
A = [0] + list(map(int, input().strip().split())) # [0] + A[1]..A[n]
r = N // (n + 1)
G = [i//r for i in range(0, N)]
res = 0 # error(A)
x = 0
for i in range(1, N):
    if i in A:
	    x += 1
    res += abs(G[i] - x)
print(res)

image-20230312144502262



思路2:按n分段,规模n到10的五次方

n, N = map(int, input().strip().split()) # n, N两个正整数
A = [0] + list(map(int, input().strip().split())) # [0] + A[1]..A[n]

r = N // (n + 1)
f_num = [0] * (n+1) # 当前f分段的剩余数的个数
for i in range(n):
	f_num[i] = A[i+1] - A[i]
f_num[n] = N - A[n]

f = g = 0 # f(i),g(i)的初始值
res = 0	# error(A)
g_num = r # 当前g分段的剩余数的个数
while f <= n:
	# 当前f分段的剩余数的个数 >= 当前g分段的剩余数的个数
	if f_num[f] >= g_num: 
		res += abs(g - f) * g_num
		f_num[f] -= g_num
		g += 1
		g_num = r
	# 当前f分段的剩余数的个数 < 当前g分段的剩余数的个数
	else:
		res += abs(g - f) * f_num[f]
		g_num -= f_num[f]
		f += 1
print(res)

image-20230312144515482

  • 序列处理类型

    • 总结,注意看题目的数值范围,N为10的九次方规模,512MB内存限制,普通遍历必然超时,就需要

      找数字规律了

      ,采用了分段的思想



版权声明:本文为m0_50078259原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。