原题链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312


测试点分析:

首先来分析一下测试点,这样可以站在命题者的角度来分析问题。

测试点 分值 数据特点
0 18 主测试点,10<=n<70,没有刁难性的数据,数据量一般,ID从0001到3000即可通过,测试基本功能。
1 4 n=7,存在+0000数据,但不存在-0000数据,ID从0000到5000。
2 2 n=7,存在-0000数据,但不存在+0000数据,ID从0000到5000。
3 1 n=2,涉及同性恋问题,ID范围非常大,几乎是0001到9999。
4 1 n=3,涉及同性恋问题,ID范围非常大,几乎是0001到9999。
5 4 70<=n<=300,ID范围非常大,几乎是0001到9999,不存在特殊数据,但是数据量大,要求程序相当完美。

刁难性数据分析:

测试点1和2形成对比,虽然n=7不大,ID范围也不大,但是存在0000的数据,意味着如果输出时没有调整成%04d的格式则无法通过。

如果默认所有的0都是+0000,则测试点2不能通过,这就要求程序考虑到+0000和-0000的区别,虽然对整数来说是一样的。

如果+0000和-0000没有区分出来,则测试点1和测试点2至少有1个不能通过,又n均为7,其余数据估计几乎相同(除了+和-),所以很难不判断+-就都通过。

测试点3和测试点4类似,均涉及同性恋问题,虽然n非常小,但是如果没有考虑同性恋,这2个测试点均无法通过。

同性恋问题主要不是要考虑性别因素,而是需要考虑人是否重复。

假设A暗恋B,A认识C认识D认识B。如果是异性恋,不妨设A为男,则AC男,BD女,因为题目给出一个人不会拥有2个性别,所以A!=D,B!=C,不会出现问题。

如果是同性恋,不妨设A为男,则ACDB均为男,但是如果程序不加考虑,则可能出现A==D或B==C的情况,所以导致Wrong Answer。

测试点5主要是数据规模均设置为最大,看程序能不能承受大量数据的测试,如果代码过于暴力,则可能无法通过该测试点。


代码分析:

利用先读一个字符的方法判断性别,g数组存放两人是否认识,下标直接是ID。

gen数组存放每人的性别,1表示男,2表示女,0表示未定义,下标直接是ID。hash数组用于存放所有的ID。

通过性别是否定义过判断某个ID是否首次出现,首次出现就将ID压入hash数组里。

最后等所有ID都进去了,再调一次快速排序把hash数组里的数据排序一下,主要是要保证输出的顺序。


AC代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define N 10000
  4.  
  5. int g[N][N],gen[N],tmp[*N][],hash[],haN;
  6.  
  7. int inc(const void *a,const void *b)
  8. {
  9. return *(int *)a-*(int *)b;
  10. }
  11.  
  12. int ab(int num)
  13. {
  14. if(num<)
  15. num=-num;
  16. return num;
  17. }
  18.  
  19. int main(void)
  20. {
  21. int n=,m=,k=,g1=,g2=,g3=,g4=;
  22. char c1='\0',c2='\0';
  23. scanf("%d%d",&n,&m);
  24. while(m--)
  25. {
  26. scanf("%*c%c%d%*c%c%d",&c1,&g1,&c2,&g2);
  27. //+0000 or -0000 AC!!!
  28. if(c1!='-')
  29. g1=(c1-'')*+g1;
  30. if(gen[g1]==)
  31. hash[haN++]=g1;
  32. gen[g1]=c1!='-'?:;
  33. if(c2!='-')
  34. g2=(c2-'')*+g2;
  35. if(gen[g2]==)
  36. hash[haN++]=g2;
  37. gen[g2]=c2!='-'?:;
  38. g[ab(g1)][ab(g2)]=g[ab(g2)][ab(g1)]=;
  39. }
  40. qsort(hash,haN,,inc);
  41. scanf("%d",&k);
  42. while(k--)
  43. {
  44. int tmpN=;
  45. scanf("%d%d",&g1,&g2);
  46. g1=ab(g1),g2=ab(g2);
  47. for(g3=;g3<haN;g3++)
  48. {
  49. if(gen[g1]^gen[hash[g3]]||!g[g1][hash[g3]]||hash[g3]==g2)//must not the same
  50. continue;
  51. for(g4=;g4<haN;g4++)
  52. if(gen[hash[g4]]==gen[g2]&&g[hash[g4]][g2]&&g[hash[g3]][hash[g4]]&&g1^hash[g4])//must not the same
  53. tmp[tmpN][]=hash[g3],tmp[tmpN][]=hash[g4],++tmpN;
  54. }
  55. printf("%d\n",tmpN);
  56. for(m=;m<tmpN;m++)
  57. printf("%04d %04d\n",tmp[m][],tmp[m][]);
  58. }
  59. return ;
  60. }

1139 First Contact PAT (Advanced Level)的更多相关文章

  1. PAT (Advanced Level) Practice(更新中)

    Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...

  2. PAT (Advanced Level) Practice 1001-1005

    PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...

  3. PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642 题目描述: The task is really simple: ...

  4. PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...

  5. PAT (Advanced Level) Practice 1041 Be Unique (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1041 Be Unique (20 分) 凌宸1642 题目描述: Being unique is so important to peo ...

  6. PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642 题目描述: To prepare for PAT, the judge someti ...

  7. PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642 题目描述: Given any string of N (≥5) ...

  8. PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642 题目描述: People in Mars represent the c ...

  9. PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642 题目描述: Notice that the number ...

随机推荐

  1. 原手下一名98年的java离职了

    原手下一名98年的java离职了,回家考试要2年. 系统做的还算凑合,毕竟年龄在这. 需要改善的地方我会放到自己的项目管理工具中去改善. 离职前他一直跟我说微服务的启动是用docker,也感谢他,我们 ...

  2. 同余方程组(EXCRT)(luogu4777)

    #include<cstdio> #include<algorithm> #define ll long long using namespace std; ll k; ll ...

  3. 第01组 Alpha冲刺(1/6)

    队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11845138.html 作业博客: https://edu.cnblogs.com/campus/fz ...

  4. 牛顿迭代法(c++)

    编写一个用牛顿法解方程x=tanx 的程序,求最接近4.5和7.7的根 #include <iostream> #include <cmath> using namespace ...

  5. eXosip、osip,以及UAC和UAS的例子

    UAC(User Agent Client) 和 UAS(User Agent Server) SIP协议采用Client/Server模型.每一个请求(Request)触发服务器的一个操作:每个操作 ...

  6. Spring注解驱动第三讲--@Filter介绍

    上一讲主要针对@ComponentScan注解做了一些说明,本文主要对@Filter的扫描条件,再做一些详细的介绍 1,FilterType.ANNOTATION 按照注解的方式进行扫描.后面clas ...

  7. xml报文标签替换正则表达式

    写在前面 需求是把所有标签中的信息替换成指定内容 例如: <transName>交易名称</transName><aaa></aaaa><tran ...

  8. Base64编码解码(java)

    java8之后 final Base64.Decoder decoder = Base64.getDecoder(); final Base64.Encoder encoder = Base64.ge ...

  9. HIVE-计算累计和

    eg:统计1-12月的累积销量,即1月为1月份的值,2月为1.2月份值的和,3月为123月份的和,12月为1-12月份值的和 SELECT   month,SUM(amount) month_amou ...

  10. webpack的带表达式require和require.context()方法

    带表达式的 require 语句如果 require参数含有表达式(expressions),会创建一个上下文(context),因为在编译时(compile time)并不清楚具体是哪一个模块被导入 ...