題目背景
你作爲一個村的村長,保衛村莊是理所當然的了.今天,村莊裏來了一隻惡龍,他有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;
}