题目
古人云:秀恩爱,分得快。
互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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
正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。
思路
先存起所有照片信息,然后只处理含有A,B的照片
以处理A的照片为例:
在所有照片里找到A的照片→找异性+算亲密值→所有A的照片处理完后,对A的异性按照亲密度排序和删除,最后判断A和B的情况
注意A和B不出现在照片里的时候,也只要输出A和B
代码(测试点2,5没过)
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
struct Qinmi {
double qinmi = 0;
string num;
};
vector < vector<string> > qinmidu;
vector <Qinmi> Aq, Bq;
using namespace std;
bool cmp(Qinmi a, Qinmi b) {
int aa=atoi(a.num.c_str());
int bb=atoi(b.num.c_str());
if(a.num[0]!='-')
return aa < bb;
else
return aa > bb;
}
vector<Qinmi> Find(string n) {
vector<Qinmi> nq;
double qinmimax=0;
for (int i = 0; i < qinmidu.size(); i++) {
if (find(qinmidu[i].begin(), qinmidu[i].end(), n) != qinmidu[i].end()) {
for (int j = 0; j < qinmidu[i].size(); j++) {
if (qinmidu[i][j][0] == '-' && n[0] != '-' || qinmidu[i][j][0] != '-' && n[0] == '-') {
vector<Qinmi>::iterator it = nq.begin();
while (it != nq.end() && (*it).num != qinmidu[i][j]) it++;
if (it == nq.end()){
nq.push_back({ 1.0 / qinmidu[i].size(),qinmidu[i][j] });
if((nq.back()).qinmi>qinmimax) qinmimax=(nq.back()).qinmi;
}
else{
(*it).qinmi += 1.0 / qinmidu[i].size();
if((*it).qinmi>qinmimax) qinmimax=(*it).qinmi;
}
}
}
}
}
vector<Qinmi>::iterator it=nq.begin();
while(it!=nq.end()){
if((*it).qinmi<qinmimax)
nq.erase(it);
else it++;
}
sort(nq.begin(), nq.end(), cmp);
return nq;
}
bool eachother(string A, string B) {
bool isB = false, isA = false;
if (Aq.size() == 0)
isB = true;
else {
int i = 0;
while (i < Aq.size()) {
if (Aq[i].num == B) {
isB = true;
break;
}
i++;
}
}
if (Bq.size() == 0)
isA = true;
else {
int i = 0;
while (i < Bq.size()) {
if (Bq[i].num == A) {
isA = true;
break;
}
i++;
}
}
return (isB && isA);
}
int main() {
int N, M;
cin >> N >> M;
for (int i = 0; i < M; i++) {
int K;
string q;
vector<string> Qin;
cin >> K;
for (int j = 0; j < K; j++) {
cin >> q;
Qin.push_back(q);
}
qinmidu.push_back(Qin);
}
string A, B;
cin >> A >> B;
Aq = Find(A);
Bq = Find(B);
if (eachother(A, B))
cout << A << ' ' << B << endl;
else{
if (Aq.size() > 0){
for(int i=0;i<Aq.size();i++)
cout << A << ' ' << Aq[i].num << endl;
}
else cout << A << ' ' << B << endl;
if (Bq.size() > 0){
for(int i=0;i<Bq.size();i++)
cout << B << ' ' << Bq[i].num << endl;
}
else cout << B << ' ' << A << endl;
}
return 0;
}
遇过的问题
总结
好坑好自闭。。
字符串直接比较容易出问题