题目背景
你作为一个村的村长,保卫村庄是理所当然的了.今天,村庄里来了一只恶龙,他有 个头,恶龙到处杀人放火。你着急了。不过天无绝人之路,现在来了一个骑士团。里面有 位成员(往下看)
题目描述
每个人都可以砍掉一个大小不超过 的头,要 个金币,求最小花费。
输入输出格式
输入格式:
第一行两个整数
下接 行,一个整数 表示 个头的大小。
下接 行,每个人可以砍的头大小或金币(金币 头的大小)。
输出格式:
一个整数,最小花费。如果无解,输出“ ”
输入输出样例
输入样例#1:
2 3
5
4
7
8
4
#输出样例#1:
11
用到贪心和排序
主要思想就是:让浪费能力最少的砍
话不多说,代码有解释
如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,nn[20010],mm[20010];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>nn[i];//nn[]存头的大小
for(int i=1;i<=m;i++) cin>>mm[i];//mm[]存勇士的能力
sort(nn+1,nn+n+1);
sort(mm+1,mm+m+1);//双排序后都是从小到大,保证当前的解是最优解
int money=0,o=1;//o用来当指针,寻找只比当前的头大一点的战士
//个人很喜欢o这个变量
for(int i=1;i<=n;i++){
while(mm[o]<nn[i]){
o++;
if(o>m){//表示所有的勇士都出场了
cout<<"you died!";//不要忘记感叹号!
return 0;
}
}
money+=mm[o];//累加花费
o++;//不管骑士有没有出场,o都要向后移,因为如果没出场,肯定是能力砍不下当前的头,又因为从小到大排序,以后的肯定也砍不下,o++就相当于跳过
}
cout<<money;//输出花费
return 0;
}