输入样例 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
代码长度限制
16 KB
时间限制
500 ms
内存限制
64 MB
栈限制
8192 KB
这题坑点就在于可能有“女光头”, 就是-0, 所以要加上这个,再有超时就是你数组开太大了
#include "bits/stdc++.h"
using namespace std;
vector<int> f, m; //存不同sex的人
int vis[1002] = {0}; //看当前这个人有没有被存到sex里面
double re[1002][1002] = {0}; //i和j之间的亲密度
int y[1002]; //临时存储一张照片里面的所有人,用于计算亲密度
vector<int> v1, v2; //计算要求的一对情侣的亲密度最高的异性
int p1 = 0, p2 = 0, f1 = 0, f2 = 0; //用来存一对情侣的编号,以及是男是女
string s1, s2;//用来判断性别的,防止有女性大光头,也就是-0
int ff(string s,int t){ //字符串转数字
int tmp = 0;
for(int i = t; i < s.length(); i ++){
tmp = tmp * 10 + (s[i] - '0');
}
return tmp;
}
void aa(int x, vector<int> &sex, vector<int> &v){ //看是男性还是女性,然后将和他/她关系最好的异性列出来
double ans = -1;
int xx;
if(x == 1) xx = p1;
else xx = p2;
for(int i = 0; i < sex.size(); i ++){
if(re[xx][sex[i]] > ans){
ans = re[xx][sex[i]];
v.clear();
v.push_back(sex[i]);
}
else if(re[xx][sex[i]] == ans){
v.push_back(sex[i]);
}
}
}
int main(){
int n, mm;
cin>>n>>mm;
while(mm--){
int k;
cin>>k;
int x;
double score = 1.0 / (double)k * 1.0; //求一张照片里的人的亲密度
string ss;
for(int i = 0; i < k; i ++){
cin>>ss;
int flag = 1;
if(ss[0] == '-') flag = 0, y[i] = ff(ss, 1);
else y[i] = ff(ss, 0);
int x = y[i];
if(!flag){
if(!vis[x]) f.push_back(x), vis[x] = 1;
}
else if(!vis[x]) m.push_back(x), vis[x] = 1;
}
for(int i = 0; i < k; i++)
for(int j = 0; j < k; j ++)
if(i != j) re[y[i]][y[j]] += score; //两两相加
}
cin>>s1>>s2;
if(s1[0] == '-') {
f1 = 1, p1 = ff(s1, 1), p2 = ff(s2, 0);
}
if(s2[0] == '-') {
f2 = 1, p2 = ff(s2, 1), p1 = ff(s1, 0);
}
if(f1 > 0 ) aa(1, m, v1);
else aa(1, f, v1);
if(f2 > 0 ) aa(2, m, v2);
else aa(2, f, v2);
int flag = 0;
//查看对方是是否是亲密度最高的人
for(int i = 0; i < v1.size(); i ++)
if(v1[i] == p2) {
flag ++;
break;
}
for(int i = 0; i < v2.size(); i ++)
if(v2[i] == p1) {
flag ++;
break;
}
if(flag == 2) {
if(f1) cout<<'-'<<p1<<" "<<p2;
if(f2) cout<<p1<<" -"<<p2;
}
else {
sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
for(int i = 0; i < v1.size(); i ++){
if(f1) cout<<"-"<<p1<<" "<<v1[i]<<endl;
else cout<<p1<<" -"<<v1[i]<<endl;
}
for(int i = 0; i < v2.size(); i ++){
if(f2) cout<<"-"<<p2<<" "<<v2[i];
else cout<<p2<<" -"<<v2[i];
if(i != v2.size() - 1 ) cout<<endl;
}
}
return 0;
}