您的位置:首页 > 编程语言 > Go语言

UVa 11292 The Dragon of Loowater 勇者斗恶龙

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

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

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

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


这道题目是一个非常简单的排序+贪心。
附AC代码:

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<cstdarg>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<list>
#include<vector>
#include<map>
#defineLLlonglong
#defineM(a)memset(a,0,sizeof(a))
usingnamespacestd;
voidClean(intcount,...)
{
va_listarg_ptr;
va_start(arg_ptr,count);
for(inti=0;i<count;i++)
M(va_arg(arg_ptr,int*));
va_end(arg_ptr);
}
intd[20009],p[20009];
intmain()
{
intn,m,kill,pay;
while(~scanf("%d%d",&n,&m)&&(n||m))
{
Clean(2,d,p);
for(inti=1;i<=n;i++)
scanf("%d",&d[i]);
for(inti=1;i<=m;i++)
scanf("%d",&p[i]);
sort(d+1,d+n+1);
sort(p+1,p+m+1);
kill=pay=0;
for(inti=1,j=1;i<=n&&j<=m;i++)
{
while(d[i]>p[j])j++;
if(p[j]>=d[i])kill+=1,pay+=p[j++];
}
if(kill>=n)printf("%d\n",pay);
elseputs("Loowaterisdoomed!");
}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航