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

题目链接: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 }
原文地址:https://www.cnblogs.com/FrankChen831X/p/10596880.html