This是我所指的问题。快速摘要:
输入:整数时间T
;银行关闭的时间(以分钟为单位),以及成对的c
和t
对,表示该人携带的现金量(整数),以及从现在起以分钟为单位的时间(如果没有,则离开该人)服务。服务一个人需要一分钟,您必须最迟在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;
}
从逻辑上来说,这对我来说很有意义,并且几乎可以通过所有测试用例。有一对夫妇失败了。我看不到它们是什么。实际上,测试用例错误指示错误的答案,而不是不良的运行时错误。有人可以帮我看看我的方法的谬误吗?
答案 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}