1. 程式人生 > >劉汝佳藍書筆記

劉汝佳藍書筆記

  • 前言:這是一個天坑,作者慢慢填吧。用來記錄自己解題思路用的,如果也對大家有用就最好了!

第一章:演算法設計基礎

1.1 思維的體操

1.1.1 勇者鬥惡龍

  • 題目描述:你的王國裡有一條n個頭的惡龍,你希望僱一些騎士把它殺死(即砍掉所有頭)。村裡有m個騎士可以僱傭,一個能力值為x的騎士可以砍掉惡龍一個直徑不超過x的頭,且需要支付x個金幣。如何僱傭騎士才能砍掉惡龍的所有頭,且需要支付的金幣最少?注意,一個騎士只能砍一個頭(且不能被僱傭兩次)。

  • 輸入格式:輸入包含多組資料。每組資料的第一行為正整數nm(1≤n,m≤20 000);以下n行每行為一個整數,即惡龍每個頭的直徑;以下m
    行每行為一個整數,即每個騎士的能力。輸入結束標誌為n=m=0。
  • 輸出格式:對於每組資料,輸出最少花費。如果無解,輸出“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;
}

1.1.2 突擊戰