UVA11292杀怪
題意:
???? 一個(gè)怪物有N個(gè)頭,每個(gè)頭都有半徑,然后有M個(gè)騎士,每個(gè)騎士能砍掉半徑小于等于
X[i]的頭,花費(fèi)為X[i],并且一個(gè)騎士只能用一次,問砍掉怪物所有頭的最小花費(fèi)。
思路:
????? 比較簡單的貪心題,我是直接把頭和騎士都放在一起,然后從大到小排序下,如果
權(quán)值一樣的讓騎士在前面,然后開始枚舉每一個(gè)點(diǎn),如果當(dāng)前點(diǎn)是騎士,那么直接進(jìn)棧,如
果不是騎士,那么就從棧里取出一個(gè),這個(gè)肯定是最省錢而且肯定可以砍掉這個(gè)頭的,如果
該從棧里取東西的時(shí)候棧里空了,那么就完不成任務(wù)了。
?
?
?
#include<stack>
#include<stdio.h>
#include<algorithm>
#define N 20000 + 20000 + 5
using namespace std;
typedef struct
{
?? int x ,k;
}NODE;
NODE node[N];
bool camp(NODE a ,NODE b)
{
?? return a.x > b.x || a.x == b.x && a.k > b.k;
}
int main ()
{
??? int n ,m ,i ,Ans ,ss;
??? while(~scanf("%d %d" ,&n ,&m) && n + m)
??? {????????????
??????? for(i = 1 ;i <= n ;i ++)
??????? scanf("%d" ,&node[i].x) ,node[i].k = 0;
??????? for(i = 1 ;i <= m ;i ++)
??????? scanf("%d" ,&node[i+n].x) ,node[i+n].k = 1;
??????? sort(node + 1 ,node + n + m + 1 ,camp);
??????? ss = 0;
??????? if(m < n) Ans = 0;
??????? else
??????? {
??????????? stack<int>sk;
??????????? for(i = 1 ;i <= n + m ;i ++)
??????????? {
??????????????? if(node[i].k) sk.push(node[i].x);
??????????????? else
??????????????? {
????????????????????? if(sk.empty()) break;
????????????????????? else
????????????????????? {
???????????????????????? ss += sk.top();
???????????????????????? sk.pop();
????????????????????? }
??????????????? }
???????????????
??????????? }
??????????? if(i == n + m + 1) Ans = 1;
??????????? else Ans = 0;
??????? }
??????? Ans ? printf("%d\n" ,ss) : puts("Loowater is doomed!");???
????? }
????? return 0;
}
?
?
總結(jié)
以上是生活随笔為你收集整理的UVA11292杀怪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA10881蚂蚁
- 下一篇: UVA11729突击战(汇报和执行任务)