L2-028 秀恩爱分得快 (25 分)
古人云:秀恩爱,分得快。

互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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

感觉这种题还是比较考验模拟的功底,对代码健壮性要求高,以及正确理解题意,对输入输出的合理的处理等。
PS:这道题做过很多次:一开始写的很乱,到一次比一次思路更清晰,最终得到的经验:多使用模块化,封装和复用,能很好地改善代码的可读性已经调试难度,这和工程上是一致的,只是我之前写算法题一直没注意,觉得没必要,全写到main函数里面,结果遇到这种比较复杂的模拟题就崩溃了,总结:模块化yyds
关于超时的问题:一开始没有加代码中注释的那一行,有一个样例超时了,各种找对策:流加速 手动O2优化,效果都不明显,后来发现加一条判断语句可以大幅减少时间,看来由于是浮点数运算占用时间很高
解法一:模块化,尽可能得去封装和服用,便于调试
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
double g[N][N];
bool xb[N];
int n,m;
int a[505];int read(){//读入一个人,记录它的性别并返回编号string s;cin>>s;bool man=false;if(s[0]!='-')man=true;else s=s.substr(1,s.size()-1);int x=0;for(int i=0;i<s.size();++i){x*=10;x+=s[i]-'0';}xb[x]=man;return x;
}
double find(int x){//查找某个人的最大亲密度double res=-1;for(int i=0;i<n;++i){if(xb[x]!=xb[i]){res=max(res,g[x][i]);}}return res;
}
void out(int x){//输出一个人if(xb[x]==false)cout<<"-";cout<<x;
}
int main()
{cin>>n>>m;for(int i=0;i<m;++i){int k;cin>>k;double t=1.0/k;for(int j=0;j<k;++j)a[j]=read();for(int j=0;j<k-1;++j){for(int o=j+1;o<k;++o){int x=a[j],y=a[o];if(xb[x]==xb[y])continue;//这一行删掉不会影响正确性,但是运行时间会提升一倍左右,导致超时g[x][y]+=t;g[y][x]+=t;}}}int x,y;x=read();y=read();double mx=0,my=0;mx=find(x);my=find(y);if(g[x][y]==mx&&mx==my){out(x);cout<<" ";out(y);}else{for(int i=0;i<n;++i){if(xb[i]!=xb[x]&&g[x][i]==mx){out(x);cout<<" ";out(i);cout<<endl;}}for(int i=0;i<n;++i){if(xb[i]!=xb[y]&&g[y][i]==my){out(y);cout<<" ";out(i);cout<<endl;}}}return 0;
}
解法二:
下面的代码就是完全规规矩矩的模拟这个过程,题目以‘-’区分性别,那就以字符串读入,避开int型没法区别±0的问题,甚至最后读入那两个也仍然需要以字符串读入,并记录性别,因为前面可能没出现过,所以说要那满分需要考虑周全,程序设计过程中多使用函数模块进行代码复用,可以使得模拟题不至于写得太冗长繁杂
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,k,kk,xb[N],a[505],p,x,y;
double g[N][N];
string ct[N],t;
int toi(string s){//将字符串转化为正整数 int x=0;if(s[0]=='-')for(int i=1;i<s.size();++i)x*=10,x+=s[i]-'0';else for(int i=0;i<s.size();++i)x*=10,x+=s[i]-'0';return x;
}
int main(){cin>>n>>m;while(m--){cin>>k;kk=k;p=0;while(kk--){cin>>t;int tn=toi(t);if(t[0]=='-')xb[tn]=1;else xb[tn]=2;a[p++]=tn;}double k1=1.0/k;for(int i=0;i<k-1;++i){for(int j=i+1;j<k;++j){if(xb[a[i]]==xb[a[j]])continue;g[a[i]][a[j]]+=k1;g[a[j]][a[i]]=g[a[i]][a[j]];}}}cin>>t;x=toi(t);if(t[0]=='-')xb[x]=1;else xb[x]=2;cin>>t;y=toi(t);if(t[0]=='-')xb[y]=1;else xb[y]=2;for(int i=0;i<n;++i)if(xb[i]==1)ct[i]="-";else ct[i]="";//ct[i]存储编号i的人的性别符合,方便输出 double ma=0,mb=0;//x,y的最大亲密度 for(int i=0;i<n;++i)if(xb[i]!=xb[x])ma=max(ma,g[x][i]);for(int i=0;i<n;++i)if(xb[i]!=xb[y])mb=max(mb,g[y][i]);if(ma==mb&&g[x][y]==ma)cout<<ct[x]<<x<<" "<<ct[y]<<y<<endl;else {for(int i=0;i<n;++i)if(g[x][i]==ma&&xb[x]!=xb[i])cout<<ct[x]<<x<<" "<<ct[i]<<i<<endl;for(int i=0;i<n;++i)if(g[y][i]==mb&&xb[y]!=xb[i])cout<<ct[y]<<y<<" "<<ct[i]<<i<<endl;}  return 0;
}

L2-028 秀恩爱分得快 (25 分) 两种解法,详细分析相关推荐

  1. 秀恩爱分得快 (25 分)

    L2-028 秀恩爱分得快 (25 分) 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的 ...

  2. 【CCCC】L2-028 秀恩爱分得快 (25分),模拟题

    problem L2-028 秀恩爱分得快 (25分) 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人, ...

  3. L2-028 秀恩爱分得快 (25 分)

    L2-028 秀恩爱分得快 (25 分) 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的 ...

  4. 重返天梯-L2-028 秀恩爱分得快 (25 分)

    题目描述 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K.任意两 ...

  5. PTA-L2-028 秀恩爱分得快 (25分)

    PTA-L2-028 秀恩爱分得快 (25分) 传送门 这道题纯粹的数据结构 我们特别注意0和-0的情况,所以应该字符串读入. 如果把所有异性的亲密度值都算出来,会tle 我们只需要算出关于那一对情侣 ...

  6. 天梯赛 L2-028 秀恩爱分得快 (25 分)[测试点3 4 5][未填坑]

    L2-028 秀恩爱分得快 (25 分) 思路: 结构体储存个人最高亲密值(double)和对应异性的亲密值(vector< double > q[i]=k 表示与编号绝对值为i的异性的亲 ...

  7. L2-028 秀恩爱分得快 (25分)

    @[TOC](L2-028 秀恩爱分得快 (25分)) 题目 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K ...

  8. PTA秀恩爱分得快 (25分)

    PTA秀恩爱分得快 (25分) 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的亲密度就被 ...

  9. 团体程序设计天梯赛-练习集 L2-028 秀恩爱分得快 (25 分) (详细解法)

    题目链接:L2-028 秀恩爱分得快 题目: 古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两 ...

最新文章

  1. swift 语言评价
  2. Python需求增速达174%,AI人才缺口仍超百万!这份来自2017年的实际招聘数据如是说
  3. 虚拟主机众多用途你心仪哪一项?
  4. java I/O 以及文件编码
  5. P5488 差分与前缀和(多项式/生成函数)
  6. P4149-[IOI2011]Race【点分治】
  7. 你愿意隐姓埋名一辈子吗?” #百年百人系列
  8. 自由职业者:5步拿下新项目
  9. CODEVS1067:机器翻译(模拟水题)
  10. C语言 知识点总结完美版
  11. 计算机网络(第七版)部分课后习题含答案第一章 概述1-02 试简述分组交换的要点。分组交换最主要的特点就是采用存储转发技术。我们把要发送的整块数据称为一个报文。在发送报文之前,先把较长的报
  12. HTML网页媒体元素(视频音频)
  13. 为什么阿里云ACE考试变难了?以后还能考吗?
  14. 恐怖的广告推送。其实,我们每天都在“裸奔”!
  15. 手机APP从服务器获取列表和详情
  16. The bussiness flow between DWM and ECC
  17. Xcode各版本和IOS模拟器个版本下载
  18. 联想微型计算机b540,联想B540一体机升级CPU 加内存
  19. 2022-2028全球与中国无线和多室音频市场现状及未来发展趋势
  20. Matlab学习(台大郭彦甫)第5节-初阶绘图

热门文章

  1. 技能设计新手入门(架构参考用)
  2. 【Books】推荐书单(算法、JavaWeb、Python爬虫、机器学习、程序人生、人文社科)
  3. 在VMware11虚拟机上安装Windows 7 x64操作系统(详细教程)
  4. 报错InvalidHeader: Invalid return character or leading space in header: User-Agent
  5. windows 批量杀nginx进程
  6. python实现图像自动亮度对比度
  7. mysql 数据库重启命令_Mysql数据库常用的启动,停止以及重启操作命令
  8. test.vue奶茶店怎么用手机点单,通过小程序实现在线奶茶食品售卖,在线买单,在线排队
  9. bitset 优化dp
  10. 如何在eclipse里配置Tomcat sever