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 ...
随机推荐
- JS线程机制与事件机制
JS线程机制与事件机制 1.进程与线程 (1).定义: 进程:程序的一次执行,它占有一片独有的内存空间 CPU的基本调度单位,是程序执行的一个完整的流程 (2).进程与线程的关联 一个进程一般至少有一 ...
- A1128 | 逻辑想象能力、简洁高效美观的代码、memset的使用情景
写了三遍才AC,这真是对智商极大的侮辱 C++代码: #include <stdio.h> #include <memory.h> #include <math.h> ...
- SP5971 LCMSUM 数论
题面 题目要我们求这个: \[\sum_{i=1}^n lcm(i,n)\] 开始化式子: \[\sum_{i=1}^{n} \frac{i*n}{gcd(i,n)}\] \[\sum_{d|n} \ ...
- 【POJ2676】Sudoku
本题传送门 本题知识点:深度优先搜索 + 回溯 问题就是要让我们解决一个数独问题.如果你懂得怎么玩数独的话,那就很自然想到用暴力搜索去做题.(比如我就不会,所以先WA了一发quq) 数独符合三个条件 ...
- Web 开发中 文件上传 是出现的:java.io.FileNotFoundException: (文件名、目录名或卷标语法不正确。)
<span style="font-family: Arial, Helvetica, sans-serif; "> </span> <span st ...
- MP实战系列(十九)之批量新增
批量操作在实际开发中也应用非常多,例如批量下发优惠券.批量添加用户等. 以MyBatis为例,通常实现批量操作,有这么几种方式? 第一,单条插入sql语句,进行for循环遍历,基准条件是根据前端传过的 ...
- Node.js之判断字符串中是否包含某个字符串
server.txt内容如下: 阿里云服务器 关于应用场景,就不多说了,字符串是不论是后端开发还是前端开发等,都是要经常打交道了. test.js(node.js代码,只要被本地装了node.js环境 ...
- [技术博客]Android 开发 Bug Log
[技术博客] Android 开发 Bug Log 大大小小的bug,聪明的愚蠢的都有, 持续记录中...... java.lang.IllegalArgumentException: The sty ...
- 把ngnix注册为linux服务 将Nginx设置为linux下的服务 并设置nginx开机启动
一.创建服务脚本 vim /etc/init.d/nginx 脚本内容如下 #! /bin/sh# chkconfig: - 85 15 PATH=/usr/local/nginx/sbin/ DES ...
- web项目脱敏白名单管理
写在前面 下午没事, 看一下同事写的脱敏白名单管理功能. 所谓的脱敏就是将页面中查询出的信息列表当中的身份证号及手机号等关键信息部分用*号代替.该功能主要思路是新增一个页面用于配置哪些页面以及页面中哪 ...