劉汝佳藍書筆記
阿新 • • 發佈:2018-12-17
- 前言:這是一個天坑,作者慢慢填吧。用來記錄自己解題思路用的,如果也對大家有用就最好了!
第一章:演算法設計基礎
1.1 思維的體操
1.1.1 勇者鬥惡龍
題目描述:你的王國裡有一條n個頭的惡龍,你希望僱一些騎士把它殺死(即砍掉所有頭)。村裡有m個騎士可以僱傭,一個能力值為x的騎士可以砍掉惡龍一個直徑不超過x的頭,且需要支付x個金幣。如何僱傭騎士才能砍掉惡龍的所有頭,且需要支付的金幣最少?注意,一個騎士只能砍一個頭(且不能被僱傭兩次)。
- 輸入格式:輸入包含多組資料。每組資料的第一行為正整數n和m(1≤n,m≤20 000);以下n行每行為一個整數,即惡龍每個頭的直徑;以下m
輸出格式:對於每組資料,輸出最少花費。如果無解,輸出“Loowater isdoomed!”。
樣例輸出:
2 3
5
4
7
8
4
2 1
5
5
10
0 0
樣例輸出:
11
Loowater is doomed!
- 解題思路:能力小的砍直徑小的頭,能力大的砍直徑大的頭,排序比較
- 程式碼:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define maxn 20005 using namespace std; int n, m, flag, ans; int a[maxn], b[maxn]; bool vis[maxn]; int read() { int x=0; char c=getchar(); while(c<'0' || c>'9') c=getchar(); while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();} return x; } int main() { freopen("11292.in", "r", stdin); freopen("11292.out", "w", stdout); while(1) { ans=0; memset(vis, 0, sizeof(vis)); n=read(), m=read(); if(!n && !m) break; for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=m;i++) b[i]=read(); sort(a+1, a+1+n); sort(b+1, b+1+m); for(int i=1;i<=n;i++) { flag=0; for(int j=1;j<=m;j++) if(!vis[j] && b[j]>=a[i]) { vis[j]=1, flag=1, ans+=b[j]; break; } if(!flag) {printf("Loowater is doomed!\n"); break;} } if(flag) printf("%d\n",ans); } return 0; }