zoukankan      html  css  js  c++  java
  • UVa 11292 The Dragon of Loowater 勇者斗恶龙

      你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(也就是砍掉所有的头)。村里有m个骑士可以雇佣,一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头,且需要支付 x 个金币。如何雇佣骑士才能砍掉恶龙所有的头,并且支付最小的金币?注意,一个骑士只能砍一个头并且仅能被雇佣1次

      因为要保证用的钱最少,所以先把骑士按照能力值从小到大进行排序。然后从最小的开始一个一个进行匹配。在进行匹配的时候又出现一个问题,那就是每个骑士只能雇佣一次。这里有2个处理方法,第一个是开一个数组用来标记该骑士是否被雇佣。另外一个就是,将龙头也按照从小到大进行排序,从小龙头和能力值低的其实开始匹配,并保留匹配到的位置。


    拿下面这组数据进行模拟:

    2 3
    8
    5
    7
    8
    4
    将数据排序之后如下:
    龙头:5 8
    骑士:4 7 8
     
    第一轮匹配,从第一个头和第一个骑士开始。发现第一个骑士不能够砍掉第一个头。再匹配第一个头和第二个骑士,发现可以砍掉第一个头,所以雇佣这个骑士。
     
    第二轮匹配,将第二个头和第三个骑士开始匹配(因为,第一个骑士连 <= 当前龙头的龙头都不能砍掉,就更不能砍掉后面的龙头),发现可以砍掉第二个头,所以雇佣这个骑士。
     
    最后输出的结果为:
    15
     

    这道题目是一个非常简单的 排序 + 贪心。

    附AC代码:

       1: #include <stdio.h>
       2: #include <math.h>
       3: #include <iostream>
       4: #include <cstdarg>
       5: #include <algorithm>
       6: #include <string.h>
       7: #include <stdlib.h>
       8: #include <string>
       9: #include <list>
      10: #include <vector>
      11: #include <map>
      12: #define LL long long
      13: #define M(a) memset(a, 0, sizeof(a))
      14: using namespace std;
      15:  
      16: void Clean(int count, ...)
      17: {
      18:     va_list arg_ptr;
      19:     va_start (arg_ptr, count);
      20:     for (int i = 0; i < count; i++)
      21:         M(va_arg(arg_ptr, int*));
      22:     va_end(arg_ptr);
      23: }
      24:  
      25: int d[20009], p[20009];
      26:  
      27: int main()
      28: {
      29:     int n, m, kill, pay;
      30:     while (~scanf("%d%d", &n, &m) && (n || m))
      31:     {
      32:         Clean(2, d, p);
      33:         for (int i = 1; i <= n; i++)
      34:             scanf("%d", &d[i]);
      35:         for (int i = 1; i <= m; i++)
      36:             scanf("%d", &p[i]);
      37:         sort(d + 1, d + n + 1);
      38:         sort(p + 1, p + m + 1);
      39:         kill = pay = 0;
      40:         for (int i = 1, j = 1; i <= n && j <= m; i++)
      41:         {
      42:             while (d[i] > p[j]) j++;
      43:             if (p[j] >= d[i]) kill += 1, pay += p[j++];
      44:         }
      45:         if (kill >= n) printf("%d
    ", pay);
      46:         else puts("Loowater is doomed!");
      47:     }
      48:     return 0;
      49: }
  • 相关阅读:
    drf1 rest & restful规范
    git bash命令行使用https协议方式进行克隆和提交到github服务器
    git for windows+TortoiseGit客户端的使用二
    git for windows+TortoiseGit客户端的使用
    自定义Git之使用centos搭建git 服务器
    Git时光机穿梭
    创建Git版本库
    安装Git
    自定义Git之配置别名
    自定义Git之搭建Git服务器
  • 原文地址:https://www.cnblogs.com/wuhenqs/p/3202355.html
Copyright © 2011-2022 走看看