Bank Kattis问题的算法正确性

时间:2019-01-22 01:47:59

标签: c++ algorithm

This是我所指的问题。快速摘要:

输入:整数时间T;银行关闭的时间(以分钟为单位),以及成对的ct对,表示该人携带的现金量(整数),以及从现在起以分钟为单位的时间(如果没有,则离开该人)服务。服务一个人需要一分钟,您必须最迟在t时间开始为一个人服务。

输出:在关闭时间内可以收集的最大金额。

我的方法是:将所有人都放在一张映射金钱与时间的地图中。我用钱对这张地图排序。然后,我将创建一个类似于队列的结构,在该结构中,我会将钱财最多的人放到尽可能远的地方。如果该地点被占用,那么我将继续前进直到找到一个地点。如果不能,那么我就不添加此人。

下面是我的帮助函数,用于确定我是否可以插入一个人。

// returns index where we can insert, otherwise -1
int canInsert(bool* queue, int timeToInsert) {
    if (!queue[timeToInsert]) {
        return timeToInsert;
    } else {
        int index = timeToInsert-1;
        while (index >= 0) {
            if (!queue[index]) {
                return index;
            } else {
                index--;
            }
        }
        return -1;
    }
}

这是主要的驱动程序功能:

// moneyToTime is a map that maps a person's money to the time value
int Bank(int T, map<int, int> moneyToTime) {
    int answer = 0;
    bool queue[47] = {0};
    for (map<int,int>::reverse_iterator i = moneyToTime.rbegin(); i != moneyToTime.rend(); i++) {
        if (T > 0) {
            // try to insert. If we can, then add to sum. Otherwise, don't.
            int potentialIndex = canInsert(queue, i->second);
            if (potentialIndex != -1) {
                queue[potentialIndex] = 1;
                answer += i->first;
                T--;
            }
        } else {
            break;
        }
    }
    return answer;
}

从逻辑上来说,这对我来说很有意义,并且几乎可以通过所有测试用例。有一对夫妇失败了。我看不到它们是什么。实际上,测试用例错误指示错误的答案,而不是不良的运行时错误。有人可以帮我看看我的方法的谬误吗?

2 个答案:

答案 0 :(得分:1)

您没有显示如何构建moneyToTime,但是无论如何看起来map<int, int>都是错误的类型。想象一下,您有很多人拥有相同的金额和不同的时间。那么您将如何在您的moneyToTime中表示?

如果我的理论正确,那么这样的例子应该会破坏您的解决方案:

3 3
2000 2
2000 1
500 2

显然最好的总和是4000 = 2000 +2000。我怀疑您只能得到2500。

答案 1 :(得分:0)

我认为TC的最佳总和是4500,

3 3
2000 2
2000 1
500 2

{金钱,时间} {2000,0} | {2000,1} | {500,2}