1. 程式人生 > >Luogu P2695 騎士的工作【題解】

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;
}