zoukankan      html  css  js  c++  java
  • [mock]12月27日

    一开始介绍项目,最后的反馈是,还是说得不清楚,需要再准备准备。

    然后两道题,第一题是有个数组,有2*n个数字,从1~n。比如n=3的数组,{1,2,2,3,1,3}。然后两两相同的数字删除,每次删除得到这两个数字的距离作为分数,最后得到分数的和,求能得到最大的分数。比如这里先消除1,然后2,3,这样分数是3+0+0,为0。

    那么首先判断出brute force的复杂度太高。之后就贪心,虽然暂时无法证明它是对的,但感觉是对的,还是继续做了(贪心是对的,其实每次把有包含关系的先取外层再取里层就行了)。

    那么n次遍历,每次得到距离最大的数字对,然后mark为-1表示删除了。但是当时觉得得到距离最大的数字对也要n^2。(最后知道O(n)就行了,一遍扫用O(n)空间记录每个数的位置并计算距离,再一遍扫得到最大数字对就行了。)

    第二题是螺母和螺帽配对,就是两组,一组螺母,一组螺帽,他们可以组成大小互不相等的n对,螺母和螺帽可以比较大小,但螺母和螺帽两组内部无法比较,找出算法,把他们都配对。

    当时想法是,任意拿出螺母中一个遍历螺帽得到配对的,而且螺帽分成两组,这样继续。但stuck在一直从螺母拿去遍历螺帽,如果此时把比出来螺帽拿着去和所有螺母遍历匹配一下,就能把螺母也分成两组。这样就有点像partition算法,就两边都分成两组了,变成子问题。评价n*logn,最差n^2。

    第一题的算法,经过回来重写:

    #include <vector>
    #include <iostream>
    using namespace std;
    
    int calculate(vector<int> &vec) {
        int ans = 0;
        int len = vec.size();
        for (int k = 0; k < len / 2; k++) {
            vector<int> first(len / 2, -1);
            vector<int> second(len / 2, -1);
            vector<int> minus(len, 0);
            int minus_count = 0;
            for (int j = 0; j < len; j++) {
                if (vec[j] == -1) {
                    minus_count++;
                    minus[j] = minus_count;
                    continue;
                }
                if (first[vec[j]-1] == -1) {
                    first[vec[j]-1] = j;
                }
                else {
                    second[vec[j]-1] = j;
                }
                minus[j] = minus_count;
            }
            int dist = -1;
            int x = -1;
            int y = -1;
            for (int j = 0; j < len / 2; j++) {
            if (first[j] == -1) continue;
                int tmp_dist = (second[j] - first[j] - 1) - (minus[second[j]] - minus[first[j]]);
                if (tmp_dist > dist) {
                    dist = tmp_dist;
                    x = first[j];
                    y = second[j];
                }
            }
            vec[x] = -1;
            vec[y] = -1;
            ans += dist;
        }
        return ans;
    }
    
    int main()
    {
        // 1, 2, 3, 3, 1, 3, 4, 5, 6, 7, 7, 6, 5, 4
        vector<int> vec;
        vec.push_back(1);
        vec.push_back(2);
        vec.push_back(2);
        vec.push_back(3);
        vec.push_back(1);
        vec.push_back(3);
        vec.push_back(4);
        vec.push_back(5);
        vec.push_back(6);
        vec.push_back(7);
        vec.push_back(7);
        vec.push_back(6);
        vec.push_back(5);
        vec.push_back(4);
        int ans = calculate(vec);
        cout << ans << endl; // 15
        system("pause");
    }
    

      

  • 相关阅读:
    分析报告生产器使用问题
    如何使用分析报告生产器来生产图表
    基础数据代换代码
    浅谈Session与Cookie的区别与联系
    TCP和UDP的区别(转)
    项目管理技巧-怎么让代码规范执行下去
    吾日三省吾身
    C# 类型基础
    泛型
    事件与委托(续)
  • 原文地址:https://www.cnblogs.com/lautsie/p/3495755.html
Copyright © 2011-2022 走看看