pta l2-28(秀恩爱分得快)

时间:2023-12-17 16:54:26

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672

题意:给n个人,m张照片,在同一张照片中的异性亲密值增加1/size(size为该照片中的人数),给出一对情侣,若两人是彼此亲密值最高的异性,则输出两人(忽视并列的),否则分别输出与两人亲密值最高的异性(若有并列按绝对值升序输出)。

思路:首先需要指出的坑在于对0与-0的处理,这就决定了输入只能用字符串输入,同理输出也是。思路大体是对每张照片中的人用set数组保存,输入情侣a,b之后,通过count函数查找set[i]中是否有a/b,有的时候就处理,因为在并列时要按升序输出,我们可以用桶来保存a/b与其他人的亲密值,输出时从0到n-1遍历即可。

AC代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn=;
int n,m,k,sex[maxn];
double maxa,maxb,pa[maxn],pb[maxn];
set<int> st[maxn]; int geti(char* s){
int ans;
if(s[]=='-')
ans=atoi(s+),sex[ans]=;
else
ans=atoi(s);
return ans;
} bool check(double x,double y){
if(abs(x-y)<0.0000001)
return true;
return false;
} void print(int x,int y){
if(sex[x]==) printf("-");
printf("%d ",x);
if(sex[y]==) printf("-");
printf("%d\n",y);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<m;++i){
scanf("%d",&k);
for(int j=;j<k;++j){
int t;
char tmp[];
scanf("%s",tmp);
t=geti(tmp);
st[i].insert(t);
}
}
int a,b;
char tmp1[],tmp2[];
scanf("%s%s",tmp1,tmp2);
a=geti(tmp1),b=geti(tmp2);
for(int i=;i<m;++i){
int sz=st[i].size();
if(st[i].count(a))
for(set<int>::iterator it=st[i].begin();it!=st[i].end();++it)
if(*it!=a&&sex[a]!=sex[*it]){
pa[*it]+=1.0/sz;
if(maxa<pa[*it]) maxa=pa[*it];
}
if(st[i].count(b))
for(set<int>::iterator it=st[i].begin();it!=st[i].end();++it)
if(*it!=b&&sex[b]!=sex[*it]){
pb[*it]+=1.0/sz;
if(maxb<pb[*it]) maxb=pb[*it];
}
}
if(maxa==pa[b]&&maxb==pb[a])
print(a,b);
else{
for(int i=;i<n;++i)
if(check(maxa,pa[i]))
print(a,i);
for(int i=;i<n;++i)
if(check(maxb,pb[i]))
print(b,i);
}
return ;
}