思路
一开始按题干描述,对每一条输入的测试数据进行验证,只能70分
去想优化,就像把他先按最早或最晚可以接受的时间进行排序,之后要是遇到拿到核酸报告的时间不满足的时候,直接把循环break掉,但是还是70分
后来想用字典,在读入数据时处理,key是拿到报告的时间,value是能去的地方的个数。然后在测试阶段直接从里面读数,还是不行
后来发现一只是两层循环,过不去的是后面10的5次方的数据,这就考虑到可能需要将两层循环降低到一层循环
借鉴了一下大佬的算法,感觉可能这些需要对一些区间片段进行处理的内容都可以使用差分数组进行优化。
具体内容下面附上代码
代码
70分:直接翻译+提前结束
n,m,k = map(int,input().split())
plan = [0]*n
for i in range(n):
plan[i] = tuple(map(int,input().split()))
plan = sorted(plan,key=lambda x:-x[0])
for _ in range(m):
q = int(input())
num = 0
for t,c in plan:
if q+k>t:
break
if q+k<=t and q+k>t-c:
num += 1
print(num)
100分:差分数组
出现区域性的问题可以考虑用差分数组,只更改两端的内容,最后累加求和得出各部分的内容
n,m,k = map(int,input().split())
N = 400010
diff = [0]*N
for _ in range(n):
t,c = map(int,input().split())
l = max(0,t-c+1)
diff[l] += 1
diff[t+1] -= 1
for i in range(1,N):
diff[i]+=diff[i-1]
for i in range(m):
q = int(input())
print(diff[q+k])
这里要注意的一点就是N的确定,题目中给了范围提示:
注意后面for循环用差分算数据值时要用N,因为最终要输出的是q+k,所以N要是100000的2倍以上,她没有给q的数据范围
这里可能就要多试几次了,一开始N=200010,得了80分,报的运行错误,猜测可能存在数组越界等问题,然后改到400010就100了……
具体这个数据范围怎么看、怎么确定。。。emmm……还在探索中,期待大佬指导啊啊啊
特征分析
这里为什么怎么想到可以用差分数组的呢
首先是先按题干的意思写,就是70分的代码,过了70%的数据,那就是后面的大数据卡住了
原来用的两层循环,那这就看能不能用一次循环把所有数据求出来,后面用的时候直接输出就好了
题干说的是给出t和c后,在[t-c,t]这段时间拿到的核酸报告都可以,这就有很明显的区间特征,碰到这种情况,就可以考虑使用差分数组求解了
差分数组
这里最关键的就是差分数组的使用了,那么在这里小结一下差分数组
差分数组指的就是数组呀,差分呢指的就是数组相邻数据之间的差值
差分数组其实就是一个辅助数组,从侧面来表示给定某一数组的变化,比较常见的是对连续区间数据进行操作
然后前缀和和差分数组的小结可以参见这篇博客