Luogu P2695 骑士的工作【题解】

题目背景

你作为一个村的村长,保卫村庄是理所当然的了.今天,村庄里来了一只恶龙,他有 n n 个头,恶龙到处杀人放火。你着急了。不过天无绝人之路,现在来了一个骑士团。里面有 m m 位成员(往下看)

题目描述

每个人都可以砍掉一个大小不超过 ( < = ) z (<=)z 的头,要 m o n e y money 个金币,求最小花费。

输入输出格式

输入格式:

第一行两个整数 n n m m

下接 n n 行,一个整数 表示 n n 个头的大小。

下接 m m 行,每个人可以砍的头大小或金币(金币 = = == 头的大小)。

输出格式:

一个整数,最小花费。如果无解,输出“ y o u you d i e d ! died!

输入输出样例
输入样例#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44023181/article/details/84946145