题解 | #用户喜好#

用户喜好

http://www.nowcoder.com/practice/d25162386a3140cbbe6dc071e1eb6ed6

二分查找(仅适用于排好序的序列)
lower_bound()函数
用于在指定区域内查找不小于(大于等于)目标值的第一个元素。语法规则如下

//在 [first, last) 区域内查找不小于 val 的元素
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
                             const T& val);
//在 [first, last) 区域内查找第一个不符合 comp 规则的元素
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
                             const T& val, Compare comp);

first 和 last 都为正向迭代器,[first, last) 用于指定函数的作用范围;val 用于指定目标元素;comp 用于自定义比较规则,此参数可以接收一个包含 2 个形参(第二个形参值始终为 val)且返回值为 bool 类型的函数,可以是普通函数,也可以是函数对象。具体见以下链接的博文
http://c.biancheng.net/view/7521.html

upper_bound()函数
用于在指定范围内查找大于目标值的第一个元素。语法规则如下

//查找[first, last)区域中第一个大于 val 的元素。
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                             const T& val);
//查找[first, last)区域中第一个不符合 comp 规则的元素
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                             const T& val, Compare comp);

具体见以下链接的博文
http://c.biancheng.net/view/7527.html

程序代码

#include<stdio.h>
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);//用户数量
    vector<int> LikeValue(n);//记录用户喜好度的数组
    for(int i=0;i<n;i++)
    {
        scanf("%d",&LikeValue[i]);
    }
    int q;//查询组数
    scanf("%d",&q);
    vector<int> l(q),r(q),k(q);//查询限制
    for(int j=0;j<q;j++)
    {
        scanf("%d%d%d",&l[j],&r[j],&k[j]);
    }

    map<int, vector<int>> mp;//将用户喜好度和用户下标建立对应的map
    for(int i=0;i<n;i++)
    {
        mp[LikeValue[i]].push_back(i+1);//在用户喜好度为LikeValue[i]的时候用户下标为i+1
    }
    //二分法
    int ans = 0;
    for(int j=0;j<q;j++)
    {
        vector<int> p = mp[k[j]];//找到喜好度为k[j]的所有用户的下标
        ans = upper_bound(p.begin(),p.end(),r[j]) - lower_bound(p.begin(), p.end(), l[j]);//上界-下界即为在(l[j],r[j])范围内的用户数量
        printf("%d\n",ans);
    }
    return 0;
}

只考虑整正数的话,下列程序可行

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;

typedef struct Search
{
    int l;
    int r;
    int k;
}Search;
Search search_value[300001];//结构体数组,记录查询组

int main()
{//输入
    int n;//输入用户的个数
    scanf("%d",&n);
    int LikeValue[300001];//每个用户的喜好值
    for(int i=0;i<n;i++)
    {
        scanf("%d",&LikeValue[i]);
    }
    int q;
    scanf("%d",&q);//查询的组数
    for(int j=0;j<q;j++)
    {//每行包含3个整数l,r,k代表一组查询,即标号为l<=i<=r的用户中对这类文章喜好值为k的用户的个数
        scanf("%d%d%d",&search_value[j].l,&search_value[j].r,&search_value[j].k);
    }

    for(int j=0;j<q;j++)
    {
        int count = 0;
        int i = 0;
        while(i<n)
        {
            if(LikeValue[i] >= search_value[j].l && LikeValue[i] <= search_value[j].r)
            {
                if(LikeValue[i] == search_value[j].k)
                {
                    count++;
                }
            }
            i++;
        }
        printf("%d\n",count);
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务