Luogu P2695 騎士的工作【題解】
阿新 • • 發佈:2018-12-15
題目背景
你作為一個村的村長,保衛村莊是理所當然的了.今天,村莊裡來了一隻惡龍,他有 個頭,惡龍到處殺人放火。你著急了。不過天無絕人之路,現在來了一個騎士團。裡面有 位成員(往下看)
題目描述
每個人都可以砍掉一個大小不超過 的頭,要 個金幣,求最小花費。
輸入輸出格式
輸入格式:
第一行兩個整數
下接 行,一個整數 表示 個頭的大小。
下接 行,每個人可以砍的頭大小或金幣(金幣 頭的大小)。
輸出格式:
一個整數,最小花費。如果無解,輸出“ ”
輸入輸出樣例
輸入樣例#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;
}