📜  门| GATE CS 2011 |问题24(1)

📅  最后修改于: 2023-12-03 14:58:19.554000             🧑  作者: Mango

门| GATE CS 2011 |问题24

问题描述

有一个特殊的门,如果你向它传递一个数字,它会将该数字相加并返回一个新的数字,但是它还有一种特殊的功能:如果该数字已经传递给门,则门将返回先前返回的数字,否则门将返回数字的总和。现在,给定N个数字和K次查询,每个查询将传递一个数字到门中,你需要为每个查询输出门的返回值。假设将每个数字传递到门中的操作成本为C。

请编写一个程序,其中包含以下功能:

  • 计算门在K个查询中的总成本
  • 提供门的返回值序列

可以假设N和K的值在整数范围内,每次查询的数字不会超过整数范围。

问题分析

首先,我们需要一个数据结构来存储前一次查询的数字和已经处理的数字的总和。为此,我们可以使用哈希表。哈希表允许我们使用常量时间O(1)来查找数字,并存储如下信息:数字、状态(已处理或未处理)和数字的总和。

当我们收到查询时,我们检查哈希表中是否存在该数字。如果存在,则返回它。否则,我们将数字添加到哈希表中,并将其与前一个数字的总和相加。然后返回数字的总和。

在K个查询的情况下,我们需要进行K次哈希表操作。因此,总成本为K*C。

代码片段
class Gate:
    def __init__(self):
        self.table = {}
        self.sum = 0

    def get(self, num):
        if num in self.table:
            return self.table[num]
        else:
            self.sum += num
            self.table[num] = self.sum
            return self.sum

def main():
    gate = Gate()
    n = int(input())
    k = int(input())
    cost = 0
    results = []
    for i in range(k):
        num = int(input())
        res = gate.get(num)
        cost += 1
        results.append(res)
    print("Total Cost: ", cost)
    print("Results: ", results)

if __name__ == '__main__':
    main()

此代码片段是Python 3的实现,它创建了一个名为Gate的类。它使用哈希表来存储数字的状态和数字的总和,并使用get()方法来处理查询。该方法返回数字或返回前一个数字的总和。main()函数获取n、k和K个查询之后,调用它并输出总成本和返回值。