简单算法的小应用

最近在牛客网上经常进行一些算法的练习,分享两个好玩的题目。

附上牛客网的链接,当然了,和ACM大神相比,这些题是入门的,想学习的童鞋就温故知新一下吧。对了这是一个比较好的平台,大家可以没事来练练手。

排序问题

不知道为啥这个题目被分在了排序算法中,我在写这道题目的时候,为了提高效率,使用了二分查找,快排等算法,依然运行超时了,真的是很难过。后来我删除了复杂的排序,直接暴力求解,反而可以了。

传送门如下:牛客网


题解如下:

我这里是使用map结构来存储主要数据的,当然效率最高内存最小的就是使用数组了;但是我为了方便理解就没有使用数组。按照基数排序的思想,我把电影的语言存在对应下标的数组中了,这样的查找效率是最高的,因为你不管怎么排序,每次去遍历是很费时的。还有一个小要点就是,你对数组下标的频繁访问(哪怕是同一个下标),不如用临时变量存储的效率高。

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;

struct Movie{
    int bj;
    int cj;
    int scoreb;
    int scorec;
    int index;
};
int main()
{
    int n,m,firstScore=0,secondScore=0,index=1;
    cin >> n;
    map<int,int> strMap;
    for(int i = 0; i < n;i++){
        int temp;
        cin >> temp;
        strMap[temp]++;
    }
    cin >> m;
    Movie ret[m];
    for(int i = 0; i < m;i++){
        //这样真的很耗时间
        ret[i].cj = 0;
        ret[i].bj = 0;
        ret[i].scoreb = 0;
        ret[i].scorec = 0;
        ret[i].index = i+1;
        cin >> ret[i].bj;
    }
    //sort(a, a+n);
    for(int i = 0; i < m;i++){
        cin >> ret[i].cj;
        //这里如果不使用temp变量,用下标访问,时间开销会多很多
        //ret[i].scoreb = caculateNum(ret[i].bj,a,n);
        //ret[i].scorec = caculateNum(ret[i].cj,a,n);
        int tempb = strMap[ret[i].bj];
        int tempc = strMap[ret[i].cj];
        int tempi = ret[i].index;
        if(tempb >= firstScore){
            if(tempb > firstScore){
                firstScore = tempb;
                secondScore = tempc;
                index = tempi;
            }else{
                if(tempc > secondScore){
                    secondScore = tempc;
                    index = tempi;
                }
            }

        }
    }
//    sort(ret, ret+m, CmpByValue());
    cout<<index<<endl;
    return 0;
}

排序问题2

这个题目就比较简单了,就是一个排序之后,求最优的过程。

传送门如下:牛客网

题解如下:


直观的想,假设我们将货仓建在第k个商店的坐标上,那么货仓左边有 k - 1 个商店,右边有 n - k - 1 个商店,当我们将货仓向右移动一个单位,那么货仓距离左面所有的商店的距离就会增加一个单位,距离右面所有的商店的距离会减少一个单位,所以应当使左右商店的个数相同, k-1 = n-k-1, 那么k=n/2, k就是整个序列中位数的位置。

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;

int a[N];

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];

    sort(a, a + n);

    int spc = a[n >> 1];
    int res = 0;

    for (int i = 0; i < n; i++)
        res += abs(a[i] - spc);

    cout << res << endl;
}