题目描述
'恩 ~~这个和这个也是朋友.把他们放在一起......哇!终于完成了'mty费了好大劲,终于找出了一支最为庞大的

军队.
fyc很高兴,立马出征与人fight.mty万万没想到fyc竟然把他也叫去了.偶像的命令不可违抗,mty只好跟着出发了.
两军交战采用一对一单挑的形式.mty一上来就遇到了一个对手.此人身高2米12,头大,腿粗.....这个人fight崇尚

防守反击,他要等mty出手,漏出破绽才进攻,且只进攻一次.现在mty有p个招数,每招都会给对方造成伤害,也会让

对手有可趁之机来攻击自己,造成伤害.
mty进攻一次需1秒,而他的对手出招很快,进攻时间可以忽略不计.
mty想在最短时间内战胜对方,请你帮帮忙.

输入格式
第一行,三个数,n,m,p(对方有n点HP,mty有m点,mty有p个招数); n<=100,m<=100,p<=1000;
接下来p行,每行两个数,x[i],y[i](表示这招会给对方造成x[i]点伤害,对手会给mty造成y[i]点伤害);
只有当对方HP为0,不包括负数,mtyHP为正数时,mty才算赢

输出格式
一个数表示mty要战胜对手所需最少秒数.如果,mty不可能赢,就输出'mty zhen mei yong!'(不包括引号)

样例输入
2 1 1
2 0
样例输出
1

//------------------------------------------------------------------------------------

分析:用f[i,j]表示对方HP为I,mty的HP为J时,需要的最少时间.

用g[i,j]记录这个状态是否能达到.

用每个技能对所有状态进行更新即可.

code:

const oo=2139062143;
var   f:array[0..101,0..101] of longint;
      g:array[0..101,0..101] of boolean;
      x,y:array[0..1001] of longint;
      n,m,p,i,j,k,ans:longint;

      function min(a,b:longint):longint;
      begin
            if a>b then exit(b); exit(a)
      end;

begin
      readln(n,m,p);
      for i:=1 to p do readln(x[i],y[i]);
      fillchar(f,sizeof(f),127);

      g[n,m]:=true;
      f[n,m]:=0;

      for i:=1 to p do
         for j:=x[i] to n do
            for k:=y[i] to m do
            if g[j,k] then
            begin
                  f[j-x[i],k-y[i]]:=min(f[j-x[i],k-y[i]],f[j,k]+1);
                  g[j-x[i],k-y[i]]:=true;
            end;

      ans:=oo;
      for i:=1 to m do ans:=min(ans,f[0,i]);
      if ans=oo then writeln('mty zhen mei yong!')
      else writeln(ans);
end.

相关文章:

  • 2021-12-30
  • 2021-09-02
  • 2022-12-23
  • 2021-09-15
  • 2021-12-10
  • 2023-03-18
猜你喜欢
  • 2022-12-23
  • 2021-04-30
  • 2022-12-23
  • 2021-10-09
  • 2021-12-14
  • 2022-12-23
  • 2021-06-18
相关资源
相似解决方案