1139 First Contact PAT (Advanced Level)
原题链接:
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代码:
- #include<stdio.h>
- #include<stdlib.h>
- #define N 10000
- int g[N][N],gen[N],tmp[*N][],hash[],haN;
- int inc(const void *a,const void *b)
- {
- return *(int *)a-*(int *)b;
- }
- int ab(int num)
- {
- if(num<)
- num=-num;
- return num;
- }
- int main(void)
- {
- int n=,m=,k=,g1=,g2=,g3=,g4=;
- char c1='\0',c2='\0';
- scanf("%d%d",&n,&m);
- while(m--)
- {
- scanf("%*c%c%d%*c%c%d",&c1,&g1,&c2,&g2);
- //+0000 or -0000 AC!!!
- if(c1!='-')
- g1=(c1-'')*+g1;
- if(gen[g1]==)
- hash[haN++]=g1;
- gen[g1]=c1!='-'?:;
- if(c2!='-')
- g2=(c2-'')*+g2;
- if(gen[g2]==)
- hash[haN++]=g2;
- gen[g2]=c2!='-'?:;
- g[ab(g1)][ab(g2)]=g[ab(g2)][ab(g1)]=;
- }
- qsort(hash,haN,,inc);
- scanf("%d",&k);
- while(k--)
- {
- int tmpN=;
- scanf("%d%d",&g1,&g2);
- g1=ab(g1),g2=ab(g2);
- for(g3=;g3<haN;g3++)
- {
- if(gen[g1]^gen[hash[g3]]||!g[g1][hash[g3]]||hash[g3]==g2)//must not the same
- continue;
- for(g4=;g4<haN;g4++)
- if(gen[hash[g4]]==gen[g2]&&g[hash[g4]][g2]&&g[hash[g3]][hash[g4]]&&g1^hash[g4])//must not the same
- tmp[tmpN][]=hash[g3],tmp[tmpN][]=hash[g4],++tmpN;
- }
- printf("%d\n",tmpN);
- for(m=;m<tmpN;m++)
- printf("%04d %04d\n",tmp[m][],tmp[m][]);
- }
- return ;
- }
1139 First Contact PAT (Advanced Level)的更多相关文章
- PAT (Advanced Level) Practice(更新中)
Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...
- PAT (Advanced Level) Practice 1001-1005
PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...
- PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642
PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642 题目描述: The task is really simple: ...
- PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...
- 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 ...
- PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642
PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642 题目描述: To prepare for PAT, the judge someti ...
- 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) ...
- 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 ...
- 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 ...
随机推荐
- 原手下一名98年的java离职了
原手下一名98年的java离职了,回家考试要2年. 系统做的还算凑合,毕竟年龄在这. 需要改善的地方我会放到自己的项目管理工具中去改善. 离职前他一直跟我说微服务的启动是用docker,也感谢他,我们 ...
- 同余方程组(EXCRT)(luogu4777)
#include<cstdio> #include<algorithm> #define ll long long using namespace std; ll k; ll ...
- 第01组 Alpha冲刺(1/6)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11845138.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- 牛顿迭代法(c++)
编写一个用牛顿法解方程x=tanx 的程序,求最接近4.5和7.7的根 #include <iostream> #include <cmath> using namespace ...
- eXosip、osip,以及UAC和UAS的例子
UAC(User Agent Client) 和 UAS(User Agent Server) SIP协议采用Client/Server模型.每一个请求(Request)触发服务器的一个操作:每个操作 ...
- Spring注解驱动第三讲--@Filter介绍
上一讲主要针对@ComponentScan注解做了一些说明,本文主要对@Filter的扫描条件,再做一些详细的介绍 1,FilterType.ANNOTATION 按照注解的方式进行扫描.后面clas ...
- xml报文标签替换正则表达式
写在前面 需求是把所有标签中的信息替换成指定内容 例如: <transName>交易名称</transName><aaa></aaaa><tran ...
- Base64编码解码(java)
java8之后 final Base64.Decoder decoder = Base64.getDecoder(); final Base64.Encoder encoder = Base64.ge ...
- HIVE-计算累计和
eg:统计1-12月的累积销量,即1月为1月份的值,2月为1.2月份值的和,3月为123月份的和,12月为1-12月份值的和 SELECT month,SUM(amount) month_amou ...
- webpack的带表达式require和require.context()方法
带表达式的 require 语句如果 require参数含有表达式(expressions),会创建一个上下文(context),因为在编译时(compile time)并不清楚具体是哪一个模块被导入 ...