洛谷 2695 骑士的工作 排序+贪心 解题报告

来源:互联网 发布:华康字体淘宝可以用吗 编辑:程序博客网 时间:2024/06/08 19:57

题目背景

你作为一个村的村长,保卫村庄是理所当然的了.今天,村庄里来了一只恶龙,他有n个头,恶龙到处杀人放火。你着急了。不过天无绝人之路,现在来了一个骑士团。里面有m位成员(往下看)

题目描述

每个人都可以砍掉一个大小不超过(<=)z的头,要money个金币,求最小花费。

输入输出格式

输入格式:

第一行两个整数 n m

下接n行,一个整数 表示n个头的大小。

下接m行,每个人可以砍的头大小或金币(金币==头的大小)。

输出格式:

一个整数,最小花费。如果无解,输出“you died!”

输入输出样例

输入样例#1:

2 3
5
4
7
8
4

输出样例#1:

11

说明

1<=n,m<=20000

思路

首先把两个数组排序,然后比较大小先看看可不可以砍完。
然后就像最小生成树那种感觉找就行了

代码

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;const int N=100000+5;int n,m,a[N],b[N],top=1,tot=0,sum=1,flag=0;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);    sort(a+1,a+n+1);    for(int i=1;i<=m;i++)    scanf("%d",&b[i]);    sort(b+1,b+m+1);    if (n>m) printf("you died!");    else    {        while(sum!=n+1)        {             if (b[top]>=a[sum])            {                tot+=b[top];                top++;                sum++;            }            else top++;            if (top==m+1&&sum!=n+1) {flag=1;break;}        }        if (flag==1) printf("you died!");        else printf("%d\n",tot);    }    return 0;}