有解决该SpaceKings问题的方法吗?

时间:2020-06-24 11:27:14

标签: python dynamic-programming greedy

Asha和Amar正在玩SpaceKings电子游戏。这是一个两人游戏,第二人是助手。 Asha在玩自己喜欢的游戏时需要您的帮助,以最大限度地发挥自己的价值。两者都面对N个外星人。阿莎(Asha)和阿玛(Amar)都在一个地方,外星人排在他们前面。阿莎(Asha)和阿玛(Amar)轮流射击外星人,她先走了。在她的回合期间,Asha可以选择向其射击的任何外星人(这意味着Asha可以选择跳过转弯)。在转弯期间,Amar总是向离他最近的外星人开枪,以帮助Asha最大化自己的金币。阿莎(Asha)和阿玛(Amar)不能射击死去的外星人。

如果阿莎向某外星人射击,其生命值降低P。如果阿玛向某外星人射击,其生命值降低Q。如果外星人的生命值低于1,则将其杀死。第i个外星人以生命值高开始。如果Asha的射杀杀死了第i个外星人,Asha会获得Gi的金牌,但是如果Amar的射杀杀死了外星人,Asha不会获得Gi的金币。阿莎可以获得的最大黄金量是多少?

输入:

每种情况都从一行包含代表P,Q和N的三个以空格分隔的整数开始。然后是N行,第i行包含代表Hi和Gi的两个以空格分隔的整数。外星人按其与阿莎和阿马尔的距离顺序给出。换句话说,只有当所有外星人<我都死了时,阿玛才会向第i个外星人开枪。

输出-阿莎可以获得的最大黄金量

输入

20 60 3

80 100

80 200

120300

输出-500

说明:

阿莎应该放弃第一个外星人。在她的前两个回合中,她应该软化第三个外星人,使其降至80 hp,以便轻松获得第二个和第三个外星人的最后一击。

这里还有一些其他测试用例:

输入

50 60 2

40100

40 90

输出-100

输入

50 60 2

40100

40200

输出-200

输入

50 100 2

60100

60200

输出-200

输入

50 400 2

60100

190200

输出-0

我的代码:

def maxGold(asha , amar , strength):
     possible = 0
     first , last = 0 , len(strength) - 1
     while True:
          strength[last][0] -= asha
          strength[first][0] -= amar
          if strength[last][0] < 0:
               possible += strength[last][1]
               last -= 1
          if strength[first][0] < 0:
               first += 1
          if first > last:
               break

     return possible

def main():
      asha , amar , aliens = list(map(int , input().split()))
      strength = []
      for i in range(1 , aliens+1):
           strength.append(list(map(int, input().split())))

      answer = maxGold(asha , amar , strength)
      print(answer)

main()

我已经绞尽脑汁,而且由于黄金也没有分类,我认为贪婪的方法行不通。谁能提供解决这个问题的方法?

谢谢。

1 个答案:

答案 0 :(得分:1)

这是我的朋友在一个编码回合中问相同问题时尝试的一个代码,它在14个案例中通过了8个案例。

import java.io.*;
import java.util.Arrays;

class code
{
    private void maxGold(int P, int Q, int n, int[] alien, int[] gold)
    {
        if(n == 2)
        {
            if((alien[0]<P && alien[1]<P && alien[0]<Q && alien[1]<Q) || (alien[0]>P && alien[1]<2*P && alien[0]<Q && alien[1]<Q))
            {
                System.out.println(Math.max(gold[0],gold[1]));
            }
            else
            {
                System.out.println(0);
            }
        }
        else
        {
            int val = P/Q;
            if(val%2!=0 || val==0)
            {
                Arrays.sort(gold);
                int s=0;
                for (int i = 0; i <n ; i++) {
                    s += gold[i];
                }
                System.out.println(s-gold[0]);  //EDITED
            }
            else
            {
                int s=0;
                for (int i = 0; i <n ; i++) {
                    s += gold[i];
                }
                System.out.println(s);
            }
        }
    }

    public static void main(String[] args) throws Exception
    {
        code object = new code();
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        String[] str1 = buf.readLine().split(" ");
        int P = Integer.parseInt(str1[0]);
        int Q = Integer.parseInt(str1[1]);
        int N = Integer.parseInt(str1[2]);

        int[] alien = new int[N];
        int[] gold = new int[N];
        for(int i=0;i<N;i++)
        {
            String[] temp = buf.readLine().split(" ");
            alien[i] = Integer.parseInt(temp[0]);
            gold[i] = Integer.parseInt(temp[1]);
        }

        object.maxGold(P,Q,N,alien,gold);
    }
}