题目链接:https://cn.vjudge.net/problem/Gym-102299H
题目大意:n名学生, m门课程,然后给出每个学生学的课程和成绩,然后问跟他最亲密的学生会教他哪一门
判断最亲密的条件是 两名学生的共同学习的课程成绩差的平方和开根号
如果和你最亲密的学生要教你的课程你已经学过了 输出-1
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define lt k<<1
#define rt k<<1|1
#define lowbit(x) x&(-x)
#define lson l,mid,lt
#define rson mid+1,r,rt
using namespace std;
typedef long long ll;
typedef long double ld;
//#define int ll
#define ios ios::sync_with_stdio(false);cin.tie(nullptr);
#define mem(a, b) memset(a, b, sizeof(a))
const double pi = acos(-1.0);
const double eps = 1e-6;
const ll mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1e6 + 50;
int st[150][150];
int dis[150][150];
int main()
{
int n, m;
cin >> n >> m;
mem(st, -1);
mem(dis, inf);
for(int i=1; i<=n; i++)
{
int x;
cin >> x;
for(int j=1; j<=x; j++)
{
int id, so;
cin >> id >> so;
st[i][id] = so;
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i!=j)
{
for(int k=1; k<=m; k++)
{
if(st[i][k] != -1 && st[j][k] != -1)
{
if(dis[i][j] == inf)
{
dis[i][j] = (st[i][k] - st[j][k]) * (st[i][k] - st[j][k]);
}
else
{
dis[i][j] += (st[i][k] - st[j][k]) * (st[i][k] - st[j][k]);
}
}
}
}
}
}
for(int i=1; i<=n; i++)
{
int x = 0, y = inf;
int minx = inf;
for(int j=1; j<=n; j++)
{
if(i == j || dis[i][j] == inf) continue;
if(dis[i][j] < minx)
{
minx = dis[i][j];
x = j;
}
}
if(minx == inf) cout << "-1" << endl;
else
{
int maxn = -1;
for(int j=1; j<=m; j++)
{
if(st[i][j] != -1) continue;
if(st[x][j] > maxn)
{
maxn = st[x][j];
y = j;
}
}
if(y == inf || maxn == -1) cout << "-1" << endl;
else cout << y << endl;
}
}
return 0;
}