刘汝佳蓝书笔记

  • 前言:这是一个天坑,作者慢慢填吧。用来记录自己解题思路用的,如果也对大家有用就最好了!

第一章:算法设计基础

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 突击战

猜你喜欢

转载自www.cnblogs.com/BigYellowDog/p/10129240.html