求圈子用户数,竟然超过时间限制(TLE)了_1

此题关键是查表,关注链与被关注链一定要分开!!

圈子:(A,爱好Y)

#include "GetUserNum.h"
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;

typedef struct tagFollowRelation
{
    unsigned int userId;//指定用户
    unsigned int followerId;//关注userId的用户
    unsigned int hobbyId;
}FollowRelation;

vector<FollowRelation> followRelationVec;
map<unsigned int, vector<unsigned int> > userHobbysMap;
set<unsigned int> followingSet;
set<unsigned int> followedSet;
set<unsigned int> circleSet;

void AddUser(unsigned int user_id, unsigned int hobby_num, const unsigned int hobby_array[])
{
    vector<unsigned int> hobbyArray;
    for(unsigned int i = 0; i < hobby_num; i++)
    {
        hobbyArray.push_back(hobby_array[i]);
    }

    userHobbysMap.insert(pair<unsigned int,vector<unsigned int> >(user_id, hobbyArray));
    return;
}

//检测指定的用户是否存在,如果存在继续判断指定的用户是否有指定的爱好,不存在返回-1
int isExistCheck(unsigned int user_id, unsigned int hobby_id)
{
    if(userHobbysMap.count(user_id) == 0)
    {
        return -1;
    }
    else if(find(userHobbysMap[user_id].begin(), userHobbysMap[user_id].end(), hobby_id) == userHobbysMap[user_id].end())
    {
        return -1;
    }

    return 0;
}

int AddFollowInfo( unsigned int user_id, unsigned int follower_id, unsigned int hobby_id )
{
    //检测输入参数是否存在
    if(isExistCheck(user_id, hobby_id) == -1 || isExistCheck(follower_id, hobby_id) == -1)
    {
        return -1;
    }

    //follower_id与user_id相同
    if(user_id == follower_id)
    {
        return -1;
    }

    //“user_id、 follower_id、hobby_id”全部相同的关注信息已经存在。
    if(!followRelationVec.empty())
    {
        vector<FollowRelation>::iterator iter = followRelationVec.begin();
        for(; iter != followRelationVec.end(); iter++)
        {
            if(iter->userId == user_id && iter->followerId == follower_id && iter->hobbyId == hobby_id)
            {
                return -1;
            }
        }
    }

    FollowRelation followRelation = {0, 0, 0};
    followRelation.userId = user_id;
    followRelation.followerId = follower_id;
    followRelation.hobbyId = hobby_id;
    followRelationVec.push_back(followRelation);
    return 0;
}

//A以电影直接或间接关注的所有用户,A是follower,即A关注的
void followingUsers(unsigned int follower_id, unsigned int hobby_id)
{
    unsigned int tempSize = 0;
    vector<FollowRelation>::iterator iterRela = followRelationVec.begin();
    for(;iterRela != followRelationVec.end(); iterRela++)
    {
        if(iterRela->followerId == follower_id && iterRela->hobbyId == hobby_id)
        {
            followingSet.insert(iterRela->userId);
        }
    }

    if(followingSet.empty())
    {
        return;
    }

    while(true)
    {
        tempSize = followingSet.size();
        set<unsigned int>::iterator iterFollowing = followingSet.begin();
        for(;iterFollowing != followingSet.end(); iterFollowing++)
        {
            vector<FollowRelation>::iterator iterRela2 = followRelationVec.begin();
            for(;iterRela2 != followRelationVec.end(); iterRela2++)
            {
                if(iterRela2->followerId == *iterFollowing && iterRela2->hobbyId == hobby_id)
                {
                    followingSet.insert(iterRela2->userId);
                }
            }
        }

        if(tempSize == followingSet.size())
        {
            return;
        }
    }
}
时间: 2024-10-10 15:04:29

求圈子用户数,竟然超过时间限制(TLE)了_1的相关文章

求圈子用户数,竟然超过时间限制(TLE)了_2

接上. //以电影直接或间接关注A的所有用户,A是user,即关注A的 void followedUsers(unsigned int user_id, unsigned int hobby_id) { unsigned int tempSize = 0; vector<FollowRelation>::iterator iterRela = followRelationVec.begin(); for(;iterRela != followRelationVec.end(); iterRel

hdu4848 求到达每个点总时间最短(sum[d[i]])。

开始的时候是暴力dfs+剪枝,怎么也不行.后来参考他人思想: 先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键:1最优性剪枝(尽量最优:目前的状态+预计还有的最小时间>min就return !),2:可行性截肢:如果当前状态+预计状态已经不可行,return.(注意考虑是 continue,还是 return !).以及放的位置!在出口放的效果一般好一些(不在下次循环内部)(理由:若该状态是后面的状态进入的,前面的会dfs到很深,所以,放在最前面,一起判断下,不行就

求质数数量 - 空间换时间

质数:被自己本身和1整出的数 int getPrimeCount(int value){ int count = 0; int arr[301] = {0};// 0 - is prime , 1 - is not prime int num = (int)sqrt((float)value); for(int i = 2; i <= num ; ++i){ if (!arr[i]){ for(int j = i; i * j < value; ++j){ arr[i * j] = 1; }

python selenuim如何判断下拉框是否加载出来,超过时间不再等待

s_flag = True time_start = time.time() while s_flag: doc = etree.HTML(unicode.encode(driver.page_source, encoding='utf-8')) from_list = doc.xpath("""//*[@id="ext-gen267"]/div""") if len(from_list) == 0: time_end = t

多个蚂蚁过独木桥,求通过的最长时间和最短时间

首先对题目进行分析: 求最长时间也就是最后掉下去的一只蚂蚁需要经历的最长时间: 求最短时间也就是最后掉下去的一只蚂蚁需要经历的最短时间:所以让所有的蚂蚁都向距离它们最近的那一段走,这样它们每个走的时间是短的,再求它们中用时最短的那个时间: 分析最长时间如下图所示: /************************************************************************* > File Name: 162.cpp > Author: > Mail:

UVA 10714-Ants(求花费的最大最小时间)

Ants Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description Problem B: Ants An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of

用数组求一位数组中的最大值,最小值和平均分,并求出有多少个数超过平均分

#include<stdio.h> main() { int a=0,b,n,i,j,s[100],max,min,w; scanf("%d",&n); w=0; for(i=0;i<n;i++) scanf("%d",&s[i]); max=s[0]; for(i=1;i<n;i++) if(max<s[i]) max=s[i]; //else {max=s[i+1];min=s[i];}} min=s[0]; for

5月14日 绿城育华NOIP巨石杯试卷解析

[题外话] 感谢UBUNTU为保存程序做出贡献:https://paste.ubuntu.com : 感谢洛谷OJ的私人题库保存题面:https://www.luogu.org : 现在我的题解的所有程序均保存在UBUNTU上,需要时单击超链接查看 : 由于题目的不确定性,现在所有测试数据的建立全部来自于参加本次巨石杯的选手 OYCY & LSH 下面的程序为本人程序,暂且未知评测状态,会有误差,会及时更正!!! 5月14日 绿城育华NOIP巨石杯试卷解析 T1 最大的最小 [地址]https:

数组-09. 求矩阵的局部极大值

数组-09. 求矩阵的局部极大值(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值.本题要求给定矩阵的全部局部极大值及其所在的位置. 输入格式: 输入在第1行中给出矩阵A的行数M和列数N(3<=M,N<=20):最后M行,每行给出A在该行的N个元素的值.数字间以空格分隔.