题目背景
你作为一个村的村长,保卫村庄是理所当然的了.今天,村庄里来了一只恶龙,他有n个头,恶龙到处杀人放火。你着急了。不过天无绝人之路,现在来了一个骑士团。里面有m位成员(往下看)
题目描述
每个人都可以砍掉一个大小不超过(<=)z的头,要money个金币,求最小花费。
输入输出格式
输入格式:
第一行两个整数 n m
下接n行,一个整数 表示n个头的大小。
下接m行,每个人可以砍的头大小或金币(金币==头的大小)。
输出格式:
一个整数,最小花费。如果无解,输出“you died!”
输入输出样例
说明
1<=n,m<=20000
分析:
贪心的基础题,将两者分别排序,然后扫一遍b,用一个指针对应指a,如果当前位置可以做到,就把指针后移一位。
CODE:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int M=200005; 8 int n,m; 9 int a[M],b[M],ans; 10 int cnt=1; 11 inline int get(){ 12 char c=getchar(); 13 int res=0; 14 while (c<'0'||c>'9') c=getchar(); 15 while (c>='0'&&c<='9'){ 16 res=(res<<3)+(res<<1)+c-'0'; 17 c=getchar(); 18 } 19 return res; 20 } 21 int main() { 22 n=get(),m=get(); 23 for (int i=1;i<=n;i++) a[i]=get(); 24 for (int i=1;i<=m;i++) b[i]=get(); 25 sort(a+1,a+n+1); 26 sort(b+1,b+m+1); 27 for (int i=1;i<=m&&cnt<=n;i++) 28 if (b[i]>=a[cnt]) cnt++,ans+=b[i]; 29 if (cnt<=n) cout<<"you died!"<<endl; 30 else cout<<ans<<endl; 31 return 0; 32 }