2016-05-31 18:22:32
题目链接: 地鼠游戏 Codevs No.1245
题目大意:
打地鼠,一开始所有地鼠都出现,但是维持的时间(s)和击中所得的积分各不同,求出采用最优策略(1s打一个)打地鼠所得
解法:
贪心+堆优化
按时间倒着选,每次将当前时间结束的地鼠加入集合
每秒在最大堆中取最上端的点加入答案即可
需要注意的地方:
1.时间顺序一定要对,正着选是错的
1 //地鼠游戏 (Codevs No.1052) 2 //贪心 3 #include<stdio.h> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 const int maxn=110; 8 struct node 9 { 10 int key; 11 int time; 12 }; 13 node F[maxn]; 14 bool comp(node a,node b) 15 { 16 return a.time>b.time; 17 } 18 priority_queue <int> q; 19 int ans; 20 int N; 21 int main() 22 { 23 scanf("%d",&N); 24 for(int i=1;i<=N;i++)scanf("%d",&F[i].time); 25 for(int i=1;i<=N;i++)scanf("%d",&F[i].key); 26 sort(F+1,F+N+1,comp); 27 int now=F[1].time; 28 int loc=1; 29 while(now) 30 { 31 while(F[loc].time==now) 32 { 33 q.push(F[loc].key); 34 loc++; 35 } 36 if(!q.empty()) 37 { 38 ans+=q.top(); 39 q.pop(); 40 } 41 now--; 42 } 43 printf("%d",ans); 44 return 0; 45 }