天梯---秀恩爱分得快(模拟+优化)

古人云:秀恩爱,分得快。

互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?

输入格式:

输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:

K P[1] ... P[K]

其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。

输出格式:

首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。

输入样例 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

注意:

不能更新所有异性的亲密度

如果用一个1005*1005的浮点数组存储任意两个人之间的亲密度,每次读入一张照片时,我们都将照片内的任意两异性之间的亲密度更新一下,TLE。

所以我们先将照片信息存起来,然后只需遍历和要查询的两个人有关的照片并更新和异性的亲密关系就行了。

不能用int来读取每个人的编号

如果直接int输入会无法处理 -0,WA。

要用字符串输入,再转换成int

  1 #include <bits/stdc++.h>
  2 const int INF=0x3f3f3f3f;
  3 typedef long long LL;
  4 const double eps =1e-8;
  5 const int mod=1e9+7;
  6 const int maxn=1e4+10;
  7 using namespace std;
  8 
  9 int sex[1010];//=1表示为男 
 10 double A[1010];//a的亲密度 
 11 double B[1010];//b的亲密度 
 12 vector<int> P[1010];//照片 
 13 
 14 int to_int(string str)//转换成数字 
 15 {
 16     const char *p=str.c_str();
 17     return abs(atoi(p));
 18 } 
 19 
 20 int main()
 21 {
 22     #ifdef DEBUG
 23     freopen("sample.txt","r",stdin);
 24     #endif
 25     
 26     int n,m;
 27     cin>>n>>m;
 28     for(int i=1;i<=m;i++)
 29     {
 30         int k;
 31         cin>>k;
 32         while(k--)
 33         {
 34             string str;
 35             cin>>str;
 36             int x=to_int(str);
 37             P[i].push_back(x);
 38             if(str[0]!='-') sex[x]=1;
 39         }
 40     }
 41     string aa,bb;
 42     cin>>aa>>bb;
 43     int a=to_int(aa);
 44     int b=to_int(bb);
 45     double ma=0,mb=0;
 46     for(int i=1;i<=m;i++)
 47     {
 48         int fa=0,fb=0;//表示a和b是否在这张图片中出现过 
 49         for(int j=0;j<P[i].size();j++)
 50         {
 51             if(P[i][j]==a) fa=1;
 52             if(P[i][j]==b) fb=1;
 53         }
 54         if(fa)
 55         {
 56             for(int j=0;j<P[i].size();j++)
 57             {
 58                 if(sex[a]!=sex[P[i][j]])
 59                 {
 60                     A[P[i][j]]+=1.0/P[i].size();
 61                     ma=max(ma,A[P[i][j]]);
 62                 }
 63             }
 64         }
 65         if(fb)
 66         {
 67             for(int j=0;j<P[i].size();j++)
 68             {
 69                 if(sex[b]!=sex[P[i][j]])
 70                 {
 71                     B[P[i][j]]+=1.0/P[i].size();
 72                     mb=max(mb,B[P[i][j]]);
 73                 }
 74             }
 75         }
 76     }
 77     if(ma==A[b]&&mb==B[a]) cout<<aa<<' '<<bb<<endl;
 78     else
 79     {
 80         for(int i=0;i<n;i++)
 81         {
 82             if(ma==A[i])
 83             {
 84                 cout<<aa<<' ';
 85                 if(sex[i]!=1) cout<<'-';
 86                 cout<<i<<endl;
 87             }
 88         }
 89         for(int i=0;i<n;i++)
 90         {
 91             if(mb==B[i])
 92             {
 93                 cout<<bb<<' ';
 94                 if(sex[i]!=1) cout<<'-';
 95                 cout<<i<<endl;
 96             }
 97         }
 98     }
 99     
100     return 0;
101 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12529107.html