卖便当的少年吧 关注:2贴子:701
  • 4回复贴,共1


IP属地:广东1楼2017-03-14 20:06回复
    2L


    IP属地:广东2楼2017-03-14 20:07
    回复
      2026-01-20 18:57:28
      广告
      不感兴趣
      开通SVIP免广告
      地址:https_community_topcoder_com/stat?c=problem_statement&pm=2288&rd=4725
      大意:一开始只有一把武器(攻击力为1),有n个boss,int类型的血量bossHealth,持有武器string类型的damage(例如“2867”,表示对第0个boss的攻击力为2,对第1个boss攻击力为8,以此类推),打败boss可以获得其武器。问最少打击几次才能把所有boss打败(最多15个boss)?【打击:比如bossHealth=15,攻击力=4,则需要打击4次】
      算法:最短路+优先队列+位运算。
      构图:每个节点代表一种持有武器的状态,节点之间的边表示状态的转移(获得武器),边的权值为获得该武器的代价(也就是,用在当前节点持有的武器,去打败boss后获得武器的最少打击次数【需要遍历当前武器,找到针对该boss最大的攻击力】)。
      细节:
      1)node { int weapon; int shots; } 其中weapon作为位状态,第i位为1表示持有该武器;shots为到达该节点的状态。
      2)起始点 0,0;目标节点 全1,最后输出的代价(最小打击次数)
      3)优先队列 priorityQueue top pop add
      4)dijkstra:while(pq not empty) {
      pop min cost node;
      check dest;
      for all neighbor node, do { update node if not in queue add }
      // 这道题为DAG,所以所有节点不会有更新,只需要加入
      }


      IP属地:广东3楼2017-03-14 22:29
      回复
        地址:https_www_nowcoder_com/questionTerminal/f9533a71aada4f35867008be22be5b6e
        大意:一个数组n个数,下标0~n-1,现在从0开始每隔2个数(包括起始位置)、删除1个数,问最后剩下的1个数是多少功。例如:0->1->2(删除)->3->4->5(删除)-> ...
        算法:模运算。
        约瑟夫环问题
        从最后剩下的一个数x0开始考虑,依次计算x0在数组为n时的位置f(n)。
        很明显,f(1) = 0,那么f(2) = 0,如下图所示
        ... ... ...
        0 6 x0 x2 x5 x3 x1 x4
        3 5 x3 x1 x4 x0 x2
        0 4 x0 x2 x3 x1
        1 3 x1 x0 x2
        1 2 x1 x0
        0 1 x0
        f(n) n 具体数组中的情况。
        下标: 0 1 2 3 4 5
        -----------------------------------------------
        xi表示最后剩下的第【i】个元素。
        由于每隔2个删,所以
        从n>=3开始
        被删的数一定是xn-1,且一定出现在下标为2的位置上,
        要推理出当前x0的位置,就需要知道当前被删的位置,
        然后结合删完以后x0所在的位置即可。
        即f(n) = (2 + f(n-1) + 1) mod n。(加1是因为下标从0开始)


        IP属地:广东本楼含有高级字体4楼2017-03-15 22:24
        收起回复