1601. 最多可达成的换楼请求数目

exiaohu 于 2022-02-28 发布

题目链接:1601. 最多可达成的换楼请求数目

暴力方法。注意到原请求列表里面最多有 16 个请求,暴力在 $2^{16}$ 个可选方案中寻找到最多可达成的请求数目。

from typing import List


class DeltaCounter:
    def __init__(self, n: int):
        self.__data = [0] * n
        self.__zeros = n

    def inc(self, key):
        self.__zeros -= self.__data[key] == 0
        self.__data[key] += 1
        self.__zeros += self.__data[key] == 0

    def dec(self, key):
        self.__zeros -= self.__data[key] == 0
        self.__data[key] -= 1
        self.__zeros += self.__data[key] == 0

    def zeros(self) -> int:
        return self.__zeros


class Solution:
    def maximumRequests(self, n: int, requests: List[List[int]]) -> int:
        ret = 0
        for plan in range(2 ** len(requests)):
            if plan.bit_count() <= ret:
                continue

            dc, num = DeltaCounter(n), 0
            for i, (fro, to) in enumerate(requests):
                if ((1 << i) & plan) != 0:
                    num += 1
                    dc.inc(to)
                    dc.dec(fro)
            if dc.zeros() == n:
                ret = max(ret, num)
        return ret