题目:
你作为一个村的村长,保卫村庄是理所当然的了。今天,村庄里来了一只恶龙,他有 n 个头,恶龙到处杀人放火。你着急了。不过天无绝人之路,现在来了一个骑士团。里面有 m 位成员(往下看)。
每个人都可以砍掉至多一个大小不超过 zi 的头,需要 zi 个金币,求最小花费。
第一行两个整数 n,m。
下接 n 行,一个整数表示 n 个头的大小。
下接 m 行,每个人可以砍的头大小和需要的金币数 z1,⋯,zm。
一个整数,最小花费。如果无解,输出 you died!
。
2 3
5
4
7
8
4
11
对于所有数据,1≤n,m≤2×10000,1≤zi≤100000。
思路:
先把头需要花费的金币与每个骑士砍掉龙头花的金币升序排序一下,再直接枚举就好了,注意,我是先枚举骑士砍掉龙头花的金币,而龙头花的金币直下标接用k来表示。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[20010],z[20010];
map<int,bool> st;
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>z[i];
}
long long sum=0;
bool t=false;
sort(a,a+n);
sort(z,z+m);
int k=0;
for(int i=0;i<m;i++){
if(a[k]<=z[i]){
k++;
sum+=z[i];
}
if(k==n){
t=true;
break;
}
}
if(t){
cout<<sum;
}else{
cout<<"you died!";
}
return 0;
}