【 天梯赛L2-028 秀恩爱分得快】

天梯赛L2-028 秀恩爱分得快

题目详情:

【 天梯赛L2-028 秀恩爱分得快】_第1张图片
【 天梯赛L2-028 秀恩爱分得快】_第2张图片
【 天梯赛L2-028 秀恩爱分得快】_第3张图片【 天梯赛L2-028 秀恩爱分得快】_第4张图片

思路:

借鉴大佬的思路:虽然这个代码存在超时的风险:但这个思路确实是简单暴力
这个题有个不好处理的点就是-0是个女生,所以一定要用字符串去存,但是0和-0都是0,这咋办:建立两个容器,一个存女生,一个存男生
这个题还要利用stoi将字符串转化为整数

详细代码:



#include
using namespace std;

int n,m,k;
vector<int>a,b;//a存女生,b存男生(用于输入的时候计算亲密度)
set<int>A,B;//A存女生,B存男生(用于最后输出的时候遍历找出最大亲密度)用set可以忽略那些重复出现的人
double g[1005][1005], maxn[1005];//g[][]存放每一对异性的亲密度,maxn存放一个人对另外异性的最大亲密度

int main()
{
	cin>>n>>m;
	string s;
	while(m--)
	{
		cin>>k;
		a.clear();
		b.clear();
		for(int i=0; i<k; i++)
		{
			cin>>s;
			if(s[0] == '-')//女生情况
			{
				a.push_back(abs(stoi(s)));
				A.insert(abs(stoi(s)));
			}
			else//男生
			{
				b.push_back(stoi(s));
				B.insert(abs(stoi(s)));
			}
		}
		for(int i=0; i<a.size(); i++)//计算每一张照片中所有异性的亲密的
		{
			for(int j=0; j<b.size(); j++)
			{
				g[a[i]][b[j]] += 1.0/k;
				g[b[j]][a[i]] += 1.0/k;
				if(maxn[a[i]] < g[a[i]][b[j]])//找出每个人最大的亲密的
				    maxn[a[i]] = g[a[i]][b[j]];
			    if(maxn[b[j]] < g[b[j]][a[i]])
			        maxn[b[j]] = g[b[j]][a[i]];
            }
		}
	}
	string s1, s2;
	cin>>s1>>s2;//情侣的编号
	int aa = abs(stoi(s1));
	int bb = abs(stoi(s2));
	if(maxn[aa] == g[aa][bb] && maxn[bb] == g[bb][aa])//如果情侣之间的亲密度都是最大的
	{
		cout<<s1<<" "<<s2;
		return 0;
	}
	if(s1[0] == '-')//如果先输入女生
	{
		for(auto p:B)
		{
			if(maxn[aa] == g[p][aa])
			    cout<<s1<<" "<<p<<endl;
		}
	}
	else 
	{
		for( auto p:A)
		{
			if(maxn[aa] == g[p][aa])
			    cout<<s1<<' '<<'-'<<p<<endl; 
		}
	}
	if(s2[0]=='-')//如果后输入女生
    {
        for(auto p:B)
            if(maxn[bb]==g[bb][p])
                cout<<s2<<' '<<p<<endl;
    }
    else
    {
        for(auto p:A)
            if(maxn[bb]==g[bb][p])
                cout<<s2<<' '<<'-'<<p<<endl;
    }
	return 0;
}

知识总结:

将数字字符转化位int输出的函数有两个:stoi和atoi
两者是有一定差别的,两者的参数是不同的,前者是string,后者是char。

你可能感兴趣的:(天梯赛,字符串,c++)