贪心,模拟

排座椅

https://www.nowcoder.com/practice/b8dc67c35bdb47e489da682e908379f7

思路:贪心的想:对于左右排列来说,如果他们落在相同的y上越多,我们越倾向于划分;对于上下排列来说,如果他们落在相同的x上越多,我们越倾向于划分。那就用两个hash表来模拟这个贪心过程即可

代码:

import sys
from collections import defaultdict

input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

def solve():
    n, m, k, l, d = LII()

    hash_x = defaultdict(list) # 统计左右排列
    hash_y = defaultdict(list) # 统计上下排列
    for _ in range(d):
        x, y, p, q = LII()
        if x == p:
            if y > q: # 把y小的作为头
                x, p = p, x
                y, q = q, y
            hash_x[y].append([x, y, p, q]) # 把y相同的左右排列放一块,方便贪心
        elif y == q:
            if x > p: # 把x小的作为头
                x, p = p, x
                y, q = q, y
            hash_y[x].append([x, y, p, q]) # 把x相同的上下排列放一块,方便贪心

    res_k = []
    for x, row in sorted(hash_y.items(), key=lambda y:-len(y[1])): # x相同的上下排列,从大到小排序
        for i in range(len(row)):
            res_k.append(row[i][0])
            break # 每个x只处理一次

    res_l = []
    for y, row in sorted(hash_x.items(), key=lambda x:-len(x[1])): # y相同的左右排列,从大到小排序
        for i in range(len(row)):
            res_l.append(row[i][1])
            break # 每个y只处理一次

    # 最终先切片,再排序
    print(*sorted(res_k[:k]))
    print(*sorted(res_l[:l]))

t = 1
# t = II()
for _ in range(t):
    solve()
#每日一题挑战#
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务