高校思政教育工作网站建设,wordpress响应式模板工业用,电商网站建设费用价格,商城网站建设模板目录
题目#xff1a;
示例#xff1a;
分析#xff1a;
代码#xff1a; 题目#xff1a; 示例#xff1a; 分析#xff1a;
题目比较长#xff0c;我概括一下就是有一群怪物#xff0c;每只怪物离城市的距离都不一样#xff0c;并且靠近的速度也不一样#x…目录
题目
示例
分析
代码 题目 示例 分析
题目比较长我概括一下就是有一群怪物每只怪物离城市的距离都不一样并且靠近的速度也不一样每次我们可以消灭一只当怪物到达城市的时候我们就失败了问我们最终可以消灭多少只怪物。
我的第一想法是直接模拟不过做了一点小优化。我们每次都先将怪物的距离减去速度表示它们移动了每次有到达城市的怪物也就是距离城市小于等于0的我们就记录下数量。最终我们比较一下到达城市的怪物和已经经过的轮数谁更大这时候轮数就等于我们击杀的怪物数量因为一轮只能杀一只怪物。如果达到城市的怪物数量大于我们击杀的数量那么结束我们返回击杀数即可。 我一开始觉得这么做应该勉强能过因为对vector进行删除元素的操作很费时间而这么操作不需要对数组进行删除元素的操作虽然也是暴力模拟但也不是单纯的模拟不过结果还是超时了我们就需要另外想一个办法。
我们先想想我们每轮需要击杀的怪物是哪一只是离城市最近的吗不是就算一个怪物离城市很近但是它的速度比较慢那也是对我们暂时没有威胁的。
我们优先消灭的怪物是最快到达的怪物所以我们可以把每个怪物到达城市所需花费的时间算出来接着对花费时间从小到大升序排序优先消灭靠前的怪物不过我们并不需要知道具体是哪一只怪物所以可以直接对存放花费时间的数组进行排序。
直接遍历排序后的数组如果第 i 个元素小于等于 i 那么就表示会有怪物在我们击杀它之前到达城市这时候返回 i 也就是轮数同时也是等于我们击杀的怪物数量。
代码
class Solution {
public:int eliminateMaximum(vectorint dist, vectorint speed) {//超时int res0;while(resdist.size()){int num0;for(int i0;idist.size();i){dist[i]-speed[i]; //预先让怪物先移动if(dist[i]0) num; //如果怪物距离小于等于0则表示到达城市,记录数量}res; //每轮至少可以击杀一个怪兽if(numres) break; //如果到达城市的怪物大于我们击杀的怪兽数,退出循环 }return res;int ndist.size();vectorintcache(n);for(int i0;in;i){ //提前计算出每只怪物到达城市需要多久cache[i]dist[i]/speed[i](dist[i]%speed[i]!0);}//按照到达的先后顺序升序排序sort(cache.begin(),cache.end());for(int i0;in;i){//如果有怪物达到的时间小于等于当前轮数,那么返回当前轮数if(cache[i]i) return i;}return n;}
};