第89场周赛

时间:2022-07-28
本文章向大家介绍第89场周赛,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

传送门

852. 山脉数组的峰顶索引

题解:根据描述,只需要找到最大值所在的索引即可

int peakIndexInMountainArray(vector<int>& A) {
        return max_element(A.begin(),A.end())-A.begin();
    }

853. 车队

题解:根据描述,第一想法是通过模拟,每经历一段时间,更新每辆车的位置,再判断各辆车的位置,对每辆车的速度进行更新,不太好些代码。

​ 那么尝试从结果出发,如果某车所在位置小,到达终点所需时间大则说明追不上前面的车。

​ 那么构建vector<pair<距离,时间>>这样向量,依据车所在位置降序排序以后,0索引0处的车子在索引1处前面,当0处的车子的时间小于1处的车子的时间,那么1处的车子追不上1处的车子,车队数目加一。能够被追上车队是花费时间最多的那队。

struct cmp{
        bool operator()(const pair<int,double>a,const pair<int,double>b){
            return a.first>b.first;
        }
    };

    int carFleet(int target, vector<int>& position, vector<int>& speed){
        int len = position.size();
        if(len==0) return 0;
        vector<pair<int,double>>car(len);
        for(int i=0;i<len;i++)
        {
            car[i] = make_pair(position[i], (target-position[i])/(double)speed[i]);
        }//组成位置,到达目的地,不需要变更车速所需时间

        sort(car.begin(),car.end(),cmp());
        int ret = 1;
        double flag = car[0].second;
        for(int i=1;i<len;i++)
        {
            if(car[i].second>flag)//追不上最慢的,在前面的车队,因为降序,接下来序列中的车子都在后面
            {
                ret++;
                flag = car[i].second;
            }
        }
        return ret;
    }

855. 考场就座

题解:题目意思可以简化为男生上厕所问题。 设置一个set<int>students,存放所有学生,学生0,就插入0到set中,学生N-1,就插入N-1。

  1. seat():当set里面没有学生,自然就需要插入0。 当set里面有学生,就需要找出那个位置最适合插入。怎么找到这个最大位置? 当set里面只有一个元素,那么需要在这个元素位置向左看,向右看 当set里面有多个元素,那么需要计算这个元素之间的距离,以及最左边元素离0位置,最右边元素离N的距离。
  2. leave():直接earse(p)即可。
class ExamRoom {
public:
    int N;
    set<int>students;
    ExamRoom(int N) {
        this->N = N;
    }
    
    int seat() {
        if(students.size()==0) 
        {
            students.insert(0);
            return 0;
        }
        if(students.size()>0)
        {
            //找到合适的位置插入,可以计算出距离最大间隔位置
            int dist = *(students.begin());//一开始的距离是该值减去0
            int pre = INT_MIN;
            int student=0;
            for (auto s: students) {
                if (pre != INT_MIN) {
                    int d = (s - pre) / 2;
                    if (d > dist) {
                        dist = d;
                        student = pre + d;
                    }
                }
                pre = s;
       
            }
            //最右边元素离N的距离判断
            if (N - 1 - *students.rbegin() > dist)
                student = N - 1;
            students.insert(student);
            return student;
        }
        return 0;
    }
    
    void leave(int p) {
        if(students.find(p)!=students.end()){
            students.erase(p);
        }
    }
};

854. 相似度为 K 的字符串