洛谷 2695 騎士的工作 排序+貪心 解題報告

題目背景

你作爲一個村的村長,保衛村莊是理所當然的了.今天,村莊裏來了一隻惡龍,他有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章