CodeForces - 1472E- Correct Placement
E
题意
题目说的是朋友 我个人觉得转换成矩形更好形容
有n 个矩形 对于每个矩形可以将它横着放或者竖着放 问能否找到另一个矩形J能够放在 i 前面并且不将 i 遮挡(i的高宽都要有剩余) 如果有的话输出符合条件的矩形的编号 否则输出-1
解题思路
理解的话好像不难想 我个人觉得难在 将其用代码表示出来
就 找到一个比这个矩形长宽都小的矩形 先将h w比较大小 将小的放在前面(这样小的和小的比不容易出错)然后 再加上序号存到新的列表(因为最后结果是输出他的序号)
再将宽降序 高升序排列(**注意:**这里一定要有一个降序一个升序 防止一个值相等而另一个值有大小也被当做符合条件)
全是升序的情况:
一个升序一个降序的情况:
代码
for _ in range(int(input())): #组数
n = int(input()) # 个数
hw = []#存储高宽列表
for i in range(n): # 有几个人 循环几次
h, w = map(int, input().split()) # 输入高 宽
if h > w: # 将宽高按升序排列
h, w = w, h
hw.append((i, h, w)) # 将宽高插入列表 并在前面标序号 每三个一组
# print(hw)
hw.sort(key=lambda x: x[2], reverse=True) # 按照宽的大小 降序
# print(hw)
hw.sort(key=lambda x: x[1], reverse= False )#在原基础上再以高为标准 用升序
# print(hw)
aa = (-1, 10 ** 10)
ans = [-1] * n
for i, h, w in hw:
if aa[1] < w:#比较宽的大小 这个时候aa[1]已经是 小高数对应的宽了 若有符合的宽 则将这个序号输出
ans[i] = aa[0] + 1
else:#将最小的第二个数的第三个数取出 ===高最小 输出他的序号和宽
aa = (i, w)
print(*ans) #去【】将内容输出