消灭兔子【贪心+堆】

Vanna ·
更新时间:2024-09-21
· 682 次阅读

题目链接 51nod 1191 消灭兔子

  兔子这么可爱,怎么能消灭呢?

  我们可以用贪心的办法来解决这个问题,因为每个箭只能使用一次,所以,我们将兔子血量从高往低排列,先做掉高血量兔子,然后再看低血量兔子,保证了伤害高但是价值小的武器假如在之前没有用到过,但是在后面可能可以利用上,所以用优先队列存所有的可以用到的武器的价钱,升序。

#include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045 #define INF 0x3f3f3f3f3f3f3f3f #define eps 1e-8 #define HalF (l + r)>>1 #define lsn rt<<1 #define rsn rt<<1|1 #define Lson lsn, l, mid #define Rson rsn, mid+1, r #define QL Lson, ql, qr #define QR Rson, ql, qr #define myself rt, l, r #define MP(a, b) make_pair(a, b) using namespace std; typedef unsigned long long ull; typedef unsigned int uit; typedef long long ll; const int maxN = 5e4 + 7; int N, M, Hp[maxN]; pair P[maxN]; priority_queue<int, vector , greater > Q; int main() { scanf("%d%d", &N, &M); for(int i=1; i<=N; i++) scanf("%d", &Hp[i]); for(int i=1; i= Hp[i]) { Q.push(P[k].second); k--; } if(Q.empty()) { ok = false; break; } ans += Q.top(); Q.pop(); } if(ok) printf("%lld\n", ans); else printf("No Solution\n"); return 0; }
作者:Andres_Lionel



兔子

需要 登录 后方可回复, 如果你还没有账号请 注册新账号