51nod 1191(贪心+优先队列)

怼烎@ 2022-07-27 13:39 284阅读 0赞

有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D[i],价格为P[i](1 <= i <= M)。假设每种箭只能使用一次,每只免子也只能被射一次,计算要消灭地图上的所有兔子最少需要多少Q币。如不能杀死所有兔子,请输出No Solution。

特别说明:1、当箭的伤害值大于等于兔子的血量时,能将兔子杀死;2、血量B[i],箭的伤害值D[i],箭的价格P[i],均小于等于100000。

分析:

贪心+优先队列。

将兔子排序之后在将弓箭按伤害值排序,之后从大到小枚举兔子,然后从伤害值大到小枚举弓箭,伤害值大于等于当前兔子的弓箭入优先队列,优先队列里面花费小优先,这样将所有满足伤害值大于等于当前兔子的弓箭都入队列之后就可以直接取队首元素去杀掉当前兔子,删除队首元素,然后继续这一过程就可以了,知道兔子枚举完或者队列为空。

  1. #include <map>
  2. #include <queue>
  3. #include <stack>
  4. #include <cmath>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <algorithm>
  9. using namespace std ;
  10. #define mem(a) memset(a,0,sizeof(a))
  11. #define inf 100000005
  12. int const maxn = 50005;
  13. int b[maxn];
  14. struct node
  15. {
  16. int d,p;
  17. node(int d = 0 , int p = 0):d(d),p(p){};
  18. bool operator < (const node &u)const
  19. {
  20. if(p!=u.p)return u.p<p;//p小优先
  21. return d>u.d;
  22. }
  23. }A[maxn];
  24. bool cmp(node a,node b)
  25. {
  26. if(a.d!=b.d)return a.d<b.d; //伤害值从小到大
  27. return a.p<b.p;
  28. }
  29. int main()
  30. {
  31. int n,m;
  32. while(scanf("%d%d",&n,&m)!=EOF)
  33. {
  34. for(int i = 0 ; i < n ; i++)
  35. {
  36. scanf("%d",&b[i]);
  37. }
  38. for(int i = 0 ; i < m ; i++)
  39. {
  40. scanf("%d%d",&A[i].d,&A[i].p);
  41. }
  42. sort(b,b+n);
  43. sort(A,A+m,cmp);
  44. long long ans = 0 ;
  45. priority_queue<node> q ;
  46. int j = n-1 ;
  47. int i = m-1 ;
  48. while(j>=0)
  49. {
  50. if(i>=0&&A[i].d>=b[j])
  51. {
  52. q.push(A[i]);
  53. i--;
  54. }
  55. else
  56. {
  57. j--;
  58. if(q.empty()){break;}
  59. else {ans+=q.top().p;q.pop();}
  60. }
  61. }
  62. if(j<0)
  63. {
  64. printf("%I64d\n",ans);
  65. }
  66. else puts("No Solution");
  67. }
  68. return 0 ;
  69. }

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 51nod 1163 (贪心+优先队列

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的

    相关 51nod 1182(简单贪心

    约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。 约翰不在乎字母大小写。(也就是说

    相关 51nod 1191(贪心+优先队列)

    有N只兔子,每只有一个血量B\[i\],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D\[i\],价格为P\[i\](1 <= i <= M)。假设

    相关 51nod1099 贪心

    有N个任务需要执行,第i个任务计算时占R\[i\]个空间,而后会释放一部分,最后储存计算结果需要占据O\[i\]个空间(O\[i\] < R\[i\])。 例如:执行需要5个