题目链接: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代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 int n,m,k,sex[maxn]; 6 double maxa,maxb,pa[maxn],pb[maxn]; 7 set<int> st[maxn]; 8 9 int geti(char* s){ 10 int ans; 11 if(s[0]=='-') 12 ans=atoi(s+1),sex[ans]=1; 13 else 14 ans=atoi(s); 15 return ans; 16 } 17 18 bool check(double x,double y){ 19 if(abs(x-y)<0.0000001) 20 return true; 21 return false; 22 } 23 24 void print(int x,int y){ 25 if(sex[x]==1) printf("-"); 26 printf("%d ",x); 27 if(sex[y]==1) printf("-"); 28 printf("%d ",y); 29 } 30 31 int main(){ 32 scanf("%d%d",&n,&m); 33 for(int i=0;i<m;++i){ 34 scanf("%d",&k); 35 for(int j=0;j<k;++j){ 36 int t; 37 char tmp[5]; 38 scanf("%s",tmp); 39 t=geti(tmp); 40 st[i].insert(t); 41 } 42 } 43 int a,b; 44 char tmp1[5],tmp2[5]; 45 scanf("%s%s",tmp1,tmp2); 46 a=geti(tmp1),b=geti(tmp2); 47 for(int i=0;i<m;++i){ 48 int sz=st[i].size(); 49 if(st[i].count(a)) 50 for(set<int>::iterator it=st[i].begin();it!=st[i].end();++it) 51 if(*it!=a&&sex[a]!=sex[*it]){ 52 pa[*it]+=1.0/sz; 53 if(maxa<pa[*it]) maxa=pa[*it]; 54 } 55 if(st[i].count(b)) 56 for(set<int>::iterator it=st[i].begin();it!=st[i].end();++it) 57 if(*it!=b&&sex[b]!=sex[*it]){ 58 pb[*it]+=1.0/sz; 59 if(maxb<pb[*it]) maxb=pb[*it]; 60 } 61 } 62 if(maxa==pa[b]&&maxb==pb[a]) 63 print(a,b); 64 else{ 65 for(int i=0;i<n;++i) 66 if(check(maxa,pa[i])) 67 print(a,i); 68 for(int i=0;i<n;++i) 69 if(check(maxb,pb[i])) 70 print(b,i); 71 } 72 return 0; 73 }