首页 > 代码库 > codves1052 地鼠游戏 贪心
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 地鼠游戏 贪心
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。