zoukankan      html  css  js  c++  java
  • hdu 2616 Kill the monster

    题目大意:

      yifenfei的家乡附近有一座山,山里住着一只大怪物。作为家乡的英雄,yifenfei决定去杀了这只怪物。

      现在我们知道yifenfei有n种法术,怪物的血量为m,当怪物的 血量 <= 0 的时候意味着怪物被杀死了。在不同的时间使用不同的魔法,就有不一样的效果。现在通过表达式(A, M),告诉你每种魔法的效果。A表示这魔法能打掉怪兽A点血。M表示但怪兽的 血量 <= M的时候用这种魔法,魔法伤害加倍。

    输入:

      输入包含许多测试数据。每个测试前两个整数n,m(2 < n < 10, 1 < m < 10^7),n表示yifenfei的法术数量,m表示怪兽血量。接下来的n行,每行表示一个魔法 (Ai,Mi)。(0 < Ai, Mi <=m)。

    输出:

      每个用例输出一个整数,表示yifenfei杀死怪兽最少用的法术数目。如果yifenfei不能杀死怪兽输出-1。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 //记录法术伤害情况的数据结构
     6 typedef struct Node
     7 {
     8     int A;
     9     int M;
    10 }Node;
    11 
    12 Node spells[10];
    13 bool visit[10]; //标记数组,判断某法术是否使用过
    14 int spellCount; //feifei拥有的法术数量
    15 int minCount;   //打死怪兽需要用的最少的法术数量
    16 
    17 /* 数据初始化函数 */
    18 void init()
    19 {
    20     minCount = 10;
    21     memset(visit, 0, sizeof(visit));
    22 }
    23 
    24 /* dfs搜索 */
    25 void dfs(int count, int HP)
    26 {
    27     if (spellCount == count && HP > 0) //法术全用完了,怪兽HP > 0,返回false
    28         return;
    29     else if (minCount <= count && HP > 0) //当前用的法术数量比minCount还多,怪兽HP > 0,说明继续搜索没有价值了,返回false
    30         return;
    31     else if (minCount > count && HP <= 0) //当前使用的法术数量比minCount小,怪兽HP <=0,说明找到一种比之前好的方法。返回true
    32     {
    33         minCount = count;
    34         return;
    35     }
    36 
    37     for (int i = 0; i < spellCount; ++i)
    38     {
    39         if (false == visit[i])
    40         {
    41             visit[i] = true;
    42             int harm = (HP <= spells[i].M ? 2 * spells[i].A : spells[i].A);
    43             dfs(count + 1, HP - harm);
    44             visit[i] = false;
    45         }
    46     }
    47 }
    48 
    49 int main(void)
    50 {
    51     int HP;     //moster's HP
    52     while (scanf("%d %d", &spellCount, &HP) != EOF)
    53     {
    54         init();
    55         for (int i = 0; i < spellCount; ++i)
    56             scanf("%d %d", &spells[i].A, &spells[i].M);
    57         dfs(0, HP);
    58         if ( 10 != minCount )
    59             printf("%d
    ", minCount);
    60         else
    61             printf("-1
    ");
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/yongqiang/p/5689914.html
Copyright © 2011-2022 走看看