codves1052 地鼠游戏 贪心
Posted third2333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codves1052 地鼠游戏 贪心相关的知识,希望对你有一定的参考价值。
codves1052 地鼠游戏
贪心
题意 有n只地鼠,一开始地鼠是全部钻出来的,每只地鼠有钻出来的持续时间,t,或者说在t秒会钻回去,不再钻出来
以及打掉的分数,打一次地鼠我们需要一秒时间,求最多能获得的分值
这题其实相当于 对于每一只地鼠 我们只能在 0--ti-1这段时间内打
然后我们可以将 ti消失时间排个序
然后从最大T 枚举下去
枚举到t时,我们把消失时间 > t 的地鼠加到大根堆里面,表示t 这秒可以打这些地鼠, 然后我们每一秒取堆中的最大值就行了
这样其实就是你存在堆中的表示你一直能打的 存在堆中的就不会受到时间的限制
1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <queue> 5 #include <vector> 6 using namespace std ; 7 8 const int N = 111 ; 9 struct node{ 10 int t,val ; 11 }a[N] ; 12 int n,m,T,l,sum ; 13 14 inline bool cmp(node a,node b) 15 { 16 return a.t > b.t ; 17 } 18 19 struct cmp1{ 20 bool operator() (int a,int b) 21 { 22 return a < b ; 23 } 24 }; 25 priority_queue < int,vector<int>,cmp1 > Q ; 26 27 28 int main() 29 { 30 scanf("%d",&n) ; 31 for(int i=1;i<=n;i++) 32 scanf("%d",&a[ i ].t),T = max(T,a[ i ].t) ; 33 for(int i=1;i<=n;i++) 34 scanf("%d",&a[ i ].val) ; 35 sort(a+1,a+n+1,cmp) ; 36 37 l = 1 ; 38 for(int i=T;i>=0;i--) 39 { 40 while( l<=n&&i<a[ l ].t ) Q.push( a[ l ].val ),l++ ; 41 if(!Q.empty()) sum+=Q.top() , Q.pop() ; 42 } 43 printf("%d\n",sum) ; 44 return 0 ; 45 }
以上是关于codves1052 地鼠游戏 贪心的主要内容,如果未能解决你的问题,请参考以下文章