天梯赛 L2

阅读: 评论:0

天梯赛 L2

天梯赛 L2

古人云:秀恩爱,分得快。

互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?

输入格式:
输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:

K P[1] … P[K]

其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。

输出格式:
首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。

输入样例 1:

10 4
4 -1 2 -3 4
4 2 -3 -5 -6
3 2 4 -5
3 -6 0 2
-3 2

输出样例 1:

-3 2
2 -5
2 -6

输入样例 2:

4 4
4 -1 2 -3 0
2 0 -3
2 2 -3
2 -1 2
-3 2

输出样例 2:

-3 2

最好按照字符串输入,大坑是-0和0.第四个测试点卡n*n复杂度.
有一个小问题:这个代码63-64行注释掉的那部分和它下边那部分(65-68)
效果应该是一样的,但实际代码运行却不一样,求解QWQ!

代码

#include<bits/stdc++.h>
using namespace std;int sex[1005];
vector<int> vec[1005];double Arat[1005]={0};
double Brat[1005]={0};
int N;int M;int toint(string str)
{int p=0,base=1,i=str.length()-1;while(str[i]!=''&&str[i]!='-'){p+=base*(str[i]-'0');base*=10;i--;}if(str[0]=='-')sex[p]=-1;else sex[p]=1;return p;
}void calA(int a)
{vector<int>::iterator it;for(int i=0;i<M;i++){it=find(vec[i].begin(),vec[i].end(),a);if(it==vec[i].end()) continue;double love=1.0/vec[i].size();for(it=vec[i].begin();it!=vec[i].end();it++){Arat[*it]+=love;}}
}void calB(int a)
{vector<int>::iterator it;for(int i=0;i<M;i++){it=find(vec[i].begin(),vec[i].end(),a);if(it==vec[i].end()) continue;double love=1.0/vec[i].size();for(it=vec[i].begin();it!=vec[i].end();it++){Brat[*it]+=love;}}
}struct difp{double love;int id;bool operator<(const difp &tmp)const{if(this->love>tmp.love)return true;/*else if(this->love==tmp.love)return this->id<tmp.id?true:false;*/else if(this->love==tmp.love)if(this->id<tmp.id)return true;return false;}
};void prt(int a,int b)
{if(sex[a]==-1)cout<<"-"<<a<<" "<<b<<endl;else cout<<a<<" -"<<b<<endl;
}void pout(int a,int b)
{set<difp> sa;set<difp> sb;for(int i=0;i<N;i++){if(Arat[i]>=Arat[b]&&sex[a]+sex[i]==0){difp tmp;tmp.id=i;tmp.love=Arat[i];sa.insert(tmp);}if(Brat[i]>=Brat[a]&&sex[b]+sex[i]==0){difp tmp;tmp.id=i;tmp.love=Brat[i];sb.insert(tmp);}}set<difp>::iterator ita=sa.begin();set<difp>::iterator itb=sb.begin();// for(;itb!&#d();itb++)//   cout<<itb->love<<"    "<<itb->id<<endl;//int flagA=sa.size();//int flagB=sb.size();if(ita->love==itb->love&&ita->love==Arat[b]){prt(a,b);return ;}set<difp>::iterator it;double maxx=sa.begin()->love;for(it=sa.begin();it!&#d()&&it->love==maxx;it++){//if(it->id==b) continue;prt(a,it->id);}maxx=sb.begin()->love;for(it=sb.begin();it!&#d()&&it->love==maxx;it++){//if(it->id==a) continue;prt(b,it->id);}
}int main()
{cin>>N>>M;for(int i=0;i<M;i++){int num;cin>>num;while(num--){string str;cin>>str;int p=toint(str);vec[i].push_back(p);}}string tmp;int a,b;cin>>tmp;a=toint(tmp);cin>>tmp;b=toint(tmp);calA(a);calB(b);pout(a,b);/*for(int i=0;i<N;i++)cout<<sex[i]<<" ";cout<<endl;*//* for(int i=0;i<N;i++)cout<<Arat[i]<<" ";cout<<endl;*/return 0;
}

有一个小问题:这个代码63-64行注释掉的那部分和它下边那部分(65-68)
效果应该是一样的,但实际代码运行却不一样,求解QWQ!

本文发布于:2024-01-28 17:12:04,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064331278969.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:天梯
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23