zoukankan      html  css  js  c++  java
  • 算法竞赛入门经典训练指南

    最近在看算法竞赛入门经典训练指南这本书,书中不错的算法我将在博客中发布,和大家共同学习。

    题目:

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

    输入格式:

    输入包含多组数据。每组数据的第一行为正整数m和n(1<=m,n<=20 000);以下m行每行为一个整数,即恶龙每个头的直径;以下n行每行为一个整数,即每个骑士的能力。输入结束标志为m=n=0。

    输出格式:

    对于每组数据,输出最少花费。如果无解,输出"Loowater is doomed!"。

    样例输入:

    2 3

    5

    4

    8

    4

    2 1

    5

    5

    10

    0 0

    样例输出:

    11

    Loowater is doomed!

    分析:

    能力高的其实开价高是合理的,但是如果你派去砍一个很弱的头,那就是浪费人才了。因此,可以把雇来的骑士按照能力从小到大排序,一个一个砍就可以了。不能砍掉当前需要砍的头的骑士就不要雇佣了。


    代码如下:

    </pre><pre name="code" class="cpp">#include <cstdio>
    #include <algorithm>  //sort的使用
    using namespace std;
    
    const int maxn = 20000 + 5;
    int A[maxn],B[maxn];
    int main()
    {
    	int n,m;
    	while (scanf("%d%d",&n,&m) == 2&&n&&m)
    	{
    		for (int i = 0;i<n;i++)
    		   scanf("%d",&A[i]);
    		for ( i = 0;i<m;i++)
    		   scanf("%d",&B[i]);
    		sort(A,A+n);//排序恶龙的头
    		sort(B,B+m);//排序骑士的能力
    		int cur = 0;
    		int cost = 0;
    		for ( i = 0;i<m;i++)
    			if (B[i]>=A[cur])
    			{//骑士有能力砍掉当前的恶龙的头
    				cost += B[i];//计算花费的金币
    				if(++cur == n)
    					break;
    			}
    			if (cur<n)
    				printf("Loowater is doomed! 
    ");
    			else 
    				printf("%d
    ",cost);
    	}
    	return 0;
    }
    



  • 相关阅读:
    CREATE AGGREGATE
    技术文档列表
    jQuery 判断表单中多个 input text 中至少有一个不为空
    Java实现 蓝桥杯 算法提高 奥运会开幕式
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
  • 原文地址:https://www.cnblogs.com/BBOOT/p/3771423.html
Copyright © 2011-2022 走看看