T01230:Pass-Muraille
http://cs101.openjudge.cn/practice/01230/
【陈子良 25物理学院】我们在M16528充实的寒假生活中做过这样的题:给定一个区间集合,问最少取出多少个集合,使剩余的区间互不重叠。这题有相当直观的贪心策略:将区间按右端点排序,依次判断当前区间与之前保留的区间是否重叠,如果不重叠则保留。
这道题是加强版,给定一个区间集合,问最少取出多少个集合,使剩余的区间重叠数不超过k次。你猜怎么着?贪心策略和之前几乎完全一样。用一个列表condition存储每个点的重叠数,按区间右端点排序,对于每一个区间,判断如果加上当前区间,前面的点重叠数是否超过k,如果不超过k则保留当前区间。
python
for _ in range(int(input())):
n,k=map(int,input().split())
wall=[]
for _ in range(n):
x1,y1,x2,y2=map(int,input().split())
if x1>x2:
x1,x2=x2,x1
wall.append((x1,x2))
wall.sort(key=lambda x:(x[1],x[0]))
condition=[0]*101
s=0
for t in wall:
x1,x2=t[0],t[1]
if all(condition[x]<k for x in range(x1,x2+1)):
for x in range(x1,x2+1):
condition[x]+=1
else:
s+=1
print(s)