前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
二、题解
1.思路
模拟,需要注意一下几点:
1.存在-0,要和0区别开,因此如果用int存编号会错。可以用字符串存,第一个是否为’-'判断性别。
2.对于每一张照片,只需要处理和这一对情侣有关的数据,即如果这张照片没有这对情侣,不管它。
3.字符串排序和数字不一样,字符串排序比较到第一个字符不同就结束,因此会有"9">“11”,不符合题意。需要转化再自定义排序
int mstoi(string s){
int res;
stringstream ss;
ss<<s;
ss>>res;
return res;
}
int mabs(int x){
if(x>0)return x;
else return -x;
}
bool cmp(Qinmi a, Qinmi b) {
return mabs(mstoi(a.num))<mabs(mstoi(b.num));
}
2.代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<sstream>
#include<string>
using namespace std;
struct Qinmi {
double qinmi = 0;
string num;
};
vector < vector<string> > qinmidu;
vector <Qinmi> Aq, Bq;
using namespace std;
int mstoi(string s){
int res;
stringstream ss;
ss<<s;
ss>>res;
return res;
}
int mabs(int x){
if(x>0)return x;
else return -x;
}
bool cmp(Qinmi a, Qinmi b) {
return mabs(mstoi(a.num))<mabs(mstoi(b.num));
}
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;
}
总结
这题真好(令人自闭 )。