zoukankan      html  css  js  c++  java
  • 蜥蜴和地下室(深搜)

    个人心得:心态炸了,玩了10天的国庆来,感觉脑子太短路了,好不容易理清思路,就是先将俩边的打死,然后中间的就只能将左边的杀死才能继续深搜,

    但此时如果还大于0,就有俩种选择就是直接打死或者借助右边的打死,不过我当时用if判断,然后思维一直卡,而且数据也难以回复,后面看了

    题解发现思路是一样的不过他实现的比较好,就是将左边没死的单独拿出来,然后再将和打自己一起结合,即times是打死左边还活着的需要的次数,

    time就是打死自己需要的次数,所以只要从times+1到time枚举就能够得出。

    题目:

    哈利喜欢玩角色扮演的电脑游戏《蜥蜴和地下室》。此时,他正在扮演一个魔术师。在最后一关,他必须和一排的弓箭手战斗。他唯一能消灭他们的办法是一个火球咒语。如果哈利用他的火球咒语攻击第i个弓箭手(他们从左到右标记),这个弓箭手会失去a点生命值。同时,这个咒语使与第i个弓箭手左右相邻的弓箭手(如果存在)分别失去b(1 ≤ b < a ≤ 10)点生命值。

    因为两个端点的弓箭手(即标记为1和n的弓箭手)与你相隔较远,所以火球不能直接攻击他们。但是哈利能用他的火球攻击其他任何弓箭手。

    每个弓箭手的生命值都已知。当一个弓箭手的生命值小于0时,这个弓箭手会死亡。请求出哈利杀死所有的敌人所需使用的最少的火球数。

    如果弓箭手已经死亡,哈利仍旧可以将他的火球扔向这个弓箭手。

    Input
    第一行包含3个整数 n, a, b (3 ≤ n ≤ 10; 1 ≤ b < a ≤ 10),第二行包含n个整数——h1,h2,...,hn (1 ≤ hi ≤ 15), hi 是第i个弓箭手所拥有的生命力。
    Output
    以一行输出t——所需要的最少的火球数。
    Input示例
    3 2 1
    2 2 2
    Output示例
    3
     1 #include<iostream>
     2 #include<cstring>
     3 #include<string>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<cmath>
     7 #include<stack>
     8 #include<set>
     9 #include<queue>
    10 #include<algorithm>
    11 using namespace std;
    12 #define in 1000000007
    13 int xue[15];
    14 int n,a,b;
    15 int sum=0;
    16 int su=999999999;
    17 void dfs(int i,int sm)
    18 {
    19     if(i==n)
    20     {
    21         if(su>sm) su=sm;
    22         return ;
    23     }
    24     if(xue[i-1]<0)
    25         dfs(i+1,sm);
    26         int times=0;
    27     if(xue[i-1]>=0)
    28     {
    29         times=xue[i-1]/b+1;
    30         xue[i-1]-=times*b;
    31         xue[i]-=times*a;
    32         xue[i+1]-=times*b;
    33         dfs(i+1,sm+times);
    34         xue[i-1]+=times*b;
    35         xue[i]+=times*a;
    36         xue[i+1]+=times*b;
    37     }
    38     int time=xue[i]/a+1;
    39     if(xue[i]>=0&&time>times)
    40     {
    41         for(int j=times+1;j<=time;j++)
    42         {
    43             xue[i-1]-=j*b;
    44         xue[i]-=j*a;
    45         xue[i+1]-=j*b;
    46         dfs(i+1,sm+j);
    47         xue[i-1]+=j*b;
    48         xue[i]+=j*a;
    49         xue[i+1]+=j*b;
    50         }
    51 
    52     }
    53     return ;
    54 }
    55 int main()
    56 {
    57     cin>>n>>a>>b;
    58     for(int i=1;i<=n;i++)
    59          cin>>xue[i];
    60      int t=xue[1]/b+1;
    61      sum+=t;
    62      xue[1]-=t*b;
    63      xue[2]-=t*a;
    64      xue[3]-=t*b;
    65      if(xue[n]>=0){
    66     t=xue[n]/b+1;
    67      sum+=t;
    68      xue[n]-=t*b;
    69      xue[n-1]-=t*a;
    70      xue[n-2]-=t*b;
    71      }
    72      dfs(2,0);
    73      if(su==999999999)
    74          su=0;
    75       cout<<sum+su<<endl;
    76     return 0;
    77 }
    View Code


  • 相关阅读:
    下载windows原装镜像的官方网站
    Typora快捷键
    UOS使用ZSH终端教程
    UOS每日折腾、调教、美化
    AMD64和X86_64
    CPU架构
    23种设计模式---单例设计模式(精华)
    java学习day32-Servlet上下文--ServletContext
    java学习day32-Servlet过滤器-Filter
    java学习day32-JSP标签技术-JSTL标签库
  • 原文地址:https://www.cnblogs.com/blvt/p/7657751.html
Copyright © 2011-2022 走看看