您的位置:首页 > 其它

pat L2-019. 悄悄关注

2017-03-29 16:27 423 查看

L2-019. 悄悄关注

时间限制
150 ms

内存限制
65536 kB

代码长度限制
8000 B

判题程序
Standard

作者
陈越

新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。

输入格式:

输入首先在第一行给出某用户的关注列表,格式如下:

人数N 用户1 用户2 …… 用户N

其中N是不超过5000的正整数,每个“用户i”(i=1, ..., N)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。

之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M,随后M行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。

输出格式:

我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。

输入样例1:
10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60

输出样例1:
Ammy
Cath
Pota

输入样例2:

11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29

输出样例2:
Bing Mei You

题意:现在要找出一个用户悄悄关注的所有可能的用户。已知该用户的关注用户(并非悄悄关注),以及该用户在一段时间内给其他用户点赞的情况,如果他对某个用户点赞的次数大于对所有用户平均的点赞数,并且该用户不在关注用户的列表内,那么
这个用户就可能是一个悄悄关注的用户。
思路:对点赞情况进行排序,依据点赞次数从小到大排,那么现在就可以二分查找出比平均点赞数大的用户,对于每一个这样的用户,找一下该用户是否在关注用户的集合中出现,如果没有出现,意味着该用户可能是一个悄悄关注的用户。
AC代码:


#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<map>
#include<set>
using namespace std;
const int N_MAX = 5000 + 4, M_MAX = 10000 + 1;
struct per {
int first;
string second;
per(int first, string second) :first(first), second(second) {}
bool operator <(const per&b)const {
return this->first < b.first;
}
};
vector<per>person;
//点赞的记录
set<string>table;
set<string>Set;
int Sum(vector<per>a) {
int sum = 0;
for (vector<per>::iterator it = a.begin(); it != a.end(); it++)
sum += it->first;
return sum;
}

int main() {

int N, K;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
string s;
cin >> s;
table.insert(s);
}
scanf("%d", &K);
for (int i = 0; i < K; i++) {
string s; int a;
cin >> s;
scanf("%d", &a);
person.push_back(per(a, s));
}
int ave = Sum(person) / K;

sort(person.begin(), person.end());
string s1 = " ";//!!!!
vector<per>::iterator it = upper_bound(person.begin(), person.end(), per(ave, s1));//it指针,指向比平均赞数大的人
bool what = 0, ant = 0;
for (; it != person.end(); it++) {

set<string>::iterator iter = table.find(it->second);//在list库中查找是否有人名it->second
if (iter == table.end()) {//没有这个人
ant = 1;
Set.insert(it->second);
}

}

if (!ant)printf("Bing Mei You\n");
else {
for (set<string>::iterator it = Set.begin(); it != Set.end(); it++)
cout << *it << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: