code1052 地鼠游戏

贪心算法,从后往前

来自codevs的题解:

我的纠结思考过程:
如果每一秒都没有重复的地鼠出现 那么肯定是一个一个挨着打
如果有重复的地鼠 那么要考虑打那个更优 当然是选分值最大的

单纯这样想很合理 但是忽略了一种情况 分值小的地鼠早出现了 而后面重复的地鼠都比这个早出现的地鼠分值大
我们就不能去打这只小的 而是把时间去用在打后面重复的地鼠身上
如 1 2 2
    5 6 7

那么按照地鼠的分值排序 然后挨着打怎么样
也不对 因为分值大的地鼠也有可能停留时间长 我们早打了他 会导致时间短的地鼠没法打 而时间还空着无视可做
如 2 1
    9 5

后来看了题解才明白
把上述两种错误的思想结合起来就是把正解
我们倒着枚举时间打地鼠 这样就避免了第二种情况的错误
然后再从所有地鼠中选出能打的分值最大的 这样就避免了第一种情况的错误

设立一个大顶堆,堆中的元素是当前时间下能打的地鼠的分值
把地鼠们按照消失的时间由大到小排序,循环时间temp=最后消失的地鼠的消失时间 to 1
把所有消失时间等于temp的地鼠放入堆(表示可以打它们了)
然后取出最大的(堆顶)打掉,累加得分即可

代码如下:

#include<iostream>
#include<algorithm>
#include<queue>
#define Size 105
using namespace std;

int n;
struct Mouse{
    int t,w;
}mouse[Size];
priority_queue<int> q;

bool cnt(Mouse m1,Mouse m2){return m1.t>m2.t;} 

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>mouse[i].t;
    }
    for(int i=1;i<=n;i++){
        cin>>mouse[i].w;
    }

    sort(mouse+1,mouse+n+1,cnt);

    int ans=0;
    for(int temp=mouse[1].t,k=1;temp>0;temp--){
        while(mouse[k].t==temp){
            q.push(mouse[k].w);
            k++;
        }
        if(!q.empty()){
            ans+=q.top();
            q.pop();
        }
    }

    cout<<ans<<endl;

    return 0;
} 
时间: 2024-10-29 19:10:20

code1052 地鼠游戏的相关文章

贪心法 codevs 1052 地鼠游戏

1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力

CODEVS——T1052 地鼠游戏

 http://codevs.cn/problem/1052/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽

地鼠游戏

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力和学习习惯,所以在星期天也

codevs 1052:地鼠游戏

http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力和学习习惯,所以在星期天也不会象其他家长一样对他抓紧

codves1052 地鼠游戏 贪心

codves1052 地鼠游戏 贪心 题意 有n只地鼠,一开始地鼠是全部钻出来的,每只地鼠有钻出来的持续时间,t,或者说在t秒会钻回去,不再钻出来以及打掉的分数,打一次地鼠我们需要一秒时间,求最多能获得的分值这题其实相当于 对于每一只地鼠 我们只能在 0--ti-1这段时间内打 然后我们可以将 ti消失时间排个序 然后从最大T 枚举下去 枚举到t时,我们把消失时间 > t 的地鼠加到大根堆里面,表示t 这秒可以打这些地鼠, 然后我们每一秒取堆中的最大值就行了 这样其实就是你存在堆中的表示你一直能

codevs1052 地鼠游戏

题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力和学习习惯,所以在星期天也不会象其他家长一样对他抓紧,而是允许他在星期天上午可以自由支配时间. 地鼠游戏是一项需要

地鼠游戏 Codevs No.1245

2016-05-31 18:22:32 题目链接: 地鼠游戏 Codevs No.1245 题目大意: 打地鼠,一开始所有地鼠都出现,但是维持的时间(s)和击中所得的积分各不同,求出采用最优策略(1s打一个)打地鼠所得 解法: 贪心+堆优化 按时间倒着选,每次将当前时间结束的地鼠加入集合 每秒在最大堆中取最上端的点加入答案即可 需要注意的地方: 1.时间顺序一定要对,正着选是错的 1 //地鼠游戏 (Codevs No.1052) 2 //贪心 3 #include<stdio.h> 4 #i

1052 地鼠游戏

1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信

codevs 1052 地鼠游戏 优先队列

1052 地鼠游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1052/ Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一