- 前言:这是一个天坑,作者慢慢填吧。用来记录自己解题思路用的,如果也对大家有用就最好了!
第一章:算法设计基础
1.1 思维的体操
1.1.1 勇者斗恶龙
题目描述:你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。
- 输入格式:输入包含多组数据。每组数据的第一行为正整数n和m(1≤n,m≤20 000);以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为一个整数,即每个骑士的能力。输入结束标志为n=m=0。
输出格式:对于每组数据,输出最少花费。如果无解,输出“Loowater isdoomed!”。
样例输出:
2 3
5
4
7
8
4
2 1
5
5
10
0 0
样例输出:
11
Loowater is doomed!
- 解题思路:能力小的砍直径小的头,能力大的砍直径大的头,排序比较
- 代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 20005
using namespace std;
int n, m, flag, ans;
int a[maxn], b[maxn];
bool vis[maxn];
int read()
{
int x=0; char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x;
}
int main()
{
freopen("11292.in", "r", stdin);
freopen("11292.out", "w", stdout);
while(1)
{
ans=0;
memset(vis, 0, sizeof(vis));
n=read(), m=read();
if(!n && !m) break;
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
sort(a+1, a+1+n);
sort(b+1, b+1+m);
for(int i=1;i<=n;i++)
{
flag=0;
for(int j=1;j<=m;j++)
if(!vis[j] && b[j]>=a[i])
{
vis[j]=1, flag=1, ans+=b[j];
break;
}
if(!flag) {printf("Loowater is doomed!\n"); break;}
}
if(flag) printf("%d\n",ans);
}
return 0;
}