天梯赛&&HBU训练营——悄悄关注(两种方式)(超时解决)

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

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

人数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

限时感人

分析:这道题一点也不难,真的。。但是我不是一遍过,加上最后一遍通过一共提交了4次,前三次一直都是15分(最后一个测试点超时),第一次和第二次均使用数组,结构体,vector,第一次提交后以为是cin,cout的问题,于是换用char数组,scanf,printf,第二次仍然超时,网上有的说原因是循环,但我所有的都是单层循环,当时没往那边想就,可能就是底层的原因吧,也有可能是sort。。反正那么写就是过不了。后来改用map和vector结合(其实一开始就想用map来着,但最初也不知道为啥就想使用结构体,于是就抛弃了map),仍然超时,想不出来了已经,去网上看了看大佬们的代码,发现用的是set和map,set底层是用二叉树实现的,比较快,虽然我不懂。。。然后过了。。看来有必要总结一下关于超时的常用解决方法,省的大改代码。。不甘心放弃我的结构体,受这次的启发,我把vector改成了set,结果过了,而且和map、set的耗时一样,都是36ms,功夫不负有心人,结构体我也可以!!!所以提交了五次,O(∩_∩)O哈哈~

结构体+set正确——第五次提交

#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef struct{
     
	string name;
	int count;
}fans;

int main() {
     
	ios::sync_with_stdio(false);
	int n,m;
	double sum = 0;
	set<string> v,v2;
	string id;
	cin >> n;
	for(int i = 0;i<n;i++){
     
		cin >> id;
		v2.insert(id);
	}
	cin >> m;
	fans f[m];
	for(int i = 0;i<m;i++){
     
		cin >> f[i].name >> f[i].count;
		sum += f[i].count;
	}
	double ave = sum/m;
	int ans = 0;
	for(int i = 0;i<m;i++){
     
		if(f[i].count>ave&&v2.find(f[i].name)==v2.end()){
     
			v.insert(f[i].name);
			ans++;
		}
	}
	if(!ans){
     
		cout << "Bing Mei You" << endl;
		return 0;
	}
	for(auto it = v.begin();it!=v.end();it++){
     
		cout << *it << endl;
	}
	return 0;
}

map+set正确——第四次提交

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

int main() {
     
	ios::sync_with_stdio(false);
	int n,m;
	cin >> n;
	set<string> se;
	map<string,int> mp;
	string s;
	for(int i = 0;i<n;i++){
     
		cin >> s;
		se.insert(s);
	}
	cin >> m;
	double sum = 0;
	int count;
	for(int i = 0;i<m;i++){
     
		cin >> s >> count;
		mp.insert(make_pair(s,count));
		sum += count;
	}
	bool flag = false;
	double ave = sum/m;
	for(map<string,int>::iterator it = mp.begin();it!=mp.end();it++){
     
		if(se.find(it->first)==se.end()&&it->second>ave){
     
			cout << it->first << endl;
			flag = true;
		}
	}
	if(!flag){
     
		cout << "Bing Mei You";
	}
	return 0;
}

map+vector部分正确——第三次提交

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


int main() {
     
	ios::sync_with_stdio(false);
	int n,m;
	cin >> n;
	vector<string> v;
	map<string,int> mp;
	string s;
	for(int i = 0;i<n;i++){
     
		cin >> s;
		v.push_back(s);
	}
	cin >> m;
	double sum = 0;
	int count;
	for(int i = 0;i<m;i++){
     
		cin >> s >> count;
		mp.insert(make_pair(s,count));
		sum += count;
	}
	bool flag = false;
	double ave = sum/m;
	for(map<string,int>::iterator it = mp.begin();it!=mp.end();it++){
     
		if(find(v.begin(),v.end(),it->first)==v.end()&&it->second>ave){
     
			cout << it->first << endl;
			flag = true;
		}
	}
	if(!flag){
     
		cout << "Bing Mei You";
	}
	return 0;
}

第一、二次提交部分正确(第二次的char的就不放了)

#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef struct{
     
	string name;
	int count;
}fans;

int main() {
     
	ios::sync_with_stdio(false);
	int n,m;
	double sum = 0;
	vector<string> v,v2;
	string id;
	cin >> n;
	for(int i = 0;i<n;i++){
     
		cin >> id;
		v2.push_back(id);
	}
	cin >> m;
	fans f[m];
	for(int i = 0;i<m;i++){
     
		cin >> f[i].name >> f[i].count;
		sum += f[i].count;
	}
	double ave = sum/m;
	int ans = 0;
	for(int i = 0;i<m;i++){
     
		if(f[i].count>ave&&find(v2.begin(),v2.end(),f[i].name)==v2.end()){
     
			v.push_back(f[i].name);
			ans++;
		}
	}
	if(!ans){
     
		cout << "Bing Mei You" << endl;
		return 0;
	}
	sort(v.begin(),v.end());
	for(auto it = v.begin();it!=v.end();it++){
     
		cout << *it << endl;
	}
	return 0;
}

你可能感兴趣的:(HBU训练营,GPLT,C/C++)