今天文哥给我玩这个游戏。这个游戏以前玩过,忘记以前是怎么通过的了,再玩发现自己怎么都通不过,也是醉了。然后想怎么通过。。。。。
首先,我对游戏都没怎么想透,直接就开始思考:
1.这里都是从桥的一边到桥的另一边,那么是不是我可以这么认为。总过就3个来回的过程然后加上最后一趟一次走了两个人。假设每次过去的人是a,b,那么来回的时间就是 max(a,b)+min(a,b)=a+b;如果这么思考的话那么肯定是在最后的时候让时间多的人走才是应该的吧。
文哥说有个错误,错误就是红色的标注的。
在转念一想,我其实完全可以把桥的两面作为两个set,就是从一个set将数据全部传到另一个set。我开始假设原来的起点是 S-set,目的地是D-set。现在这个过桥的问题就是两个set在交互数据了。所以刚才的错误的式子应该写成 max(a,b)+min(D)。
既然是两个set的数据交换的话,那么我考虑贪心,即每次的数据传递都是当前的花费最小。
来模拟:
S->D, 1,3
D->S, 1
S->D, 1)12,8 2)8,6 3)6,1 .... 在S->D的过程中要考虑花费的问题,但是因为S中的元素都要到达D,其实先后并没有关系,有关系的是组合问题,组合影响花费
D->S, 3 在D->S 的过程中使用D中花费最小的
S->D, 1,3 这一步的情况下,又是1,3;花费小
D->S, 1
S->D, 1,x 结束路程
在由于上面的过程来总结:
1.在两个结合之间充当信使的是,元素排序中最小的两个。
2.当两个信使分散在两个set中时,可以作为D->S的一个返回。因为在创建要是S->D(1,3)的花费完全小于如果选择了另外的两个元素的回来花费min(a,b)。
3.当两个信使分散在两个set中时,当S->D时,完全可以将本身最大的一组元素传递过去,使得第二大的元素不花费任何代价,依靠最大元素传递。
4.没有信使时再创建信息,如此往复。
思考miss:首先自己先想到的竟然是刚过去就回来,没考虑到已经在对面的人;其次考虑的过程中应该不关心桥(flow)而关心两地(set)。