PTA 密接判定v1(close_contact1)

2023-11-25 19:15
文章标签 close pta 判定 v1 密接 contact1

本文主要是介绍PTA 密接判定v1(close_contact1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Omicron变种病毒传染性太强了,城市屡屡破防。封闭在家的我决定为防疫做点事:帮助筛选密切接触、次密切接触人员。
网格员提供了一些小区的风险时段内的接触记录、确诊人员,需要判断人员的风险分类:

  • A类:疑似病例、临床诊断病例、确诊病例。(输入数据)
  • B类:与A类人员有接触的人员。(需要判断)
  • C类:与B类人员有接触的人员。(需要判断)
  • D类:其他人员。
输入规格
  • 输入的数据有多组,处理至EOF为止。
  • 每组数据
    • 首行有4项:日期D(字符串)、小区人数N、接触记录数量C、确诊人数P,间隔1个空格。N、C、P都是非负整数。
    • 之后是C行接触记录。每条记录由两个人员ID组成,间隔1个空格。没有重复的接触记录。
    • 然后是P行确诊人员ID。
    • 为保护隐私,发给我的数据中人员ID已经脱敏,都是些序号,范围从1到N
  • 小区最多2000人。本题不考察时空复杂度。
输出规格
  • 对每组数据:
    • 输出日期,换行。
    • 按照序号由小到大逐行输出A、B、C类人员ID和类别(A/B/C字母),间隔1个空格。D类略过。
样例输入
2022-04-01 8 5 2
2 1
8 5
5 2
3 4
4 2
1
8
2022-01-01 5 0 0
样例输出
2022-04-01
1 A
2 B
4 C
5 B
8 A
2022-01-01
样例解释
  • 第1组:1、8为A类。2、5与A类人员有接触,属于密接B类。4与B类人员有接触,属于次密接C类。
  • 第2组:为空。
提示
  • 最多2K人,接触记录排除重复后最多2K * 2K ~ 4M条,可以用布尔型的二维数组bool contact[N][N];记录,当contact[u][v]为true时表示编号u和v的人员有接触。约需要4M字节,空间可行。
    • 是否接触其实用1-bit就能表示,1-byte能表示8条接触记录,所以只需4M / 8 ~ 512KB
  • 人员类别可用数组char tag[N]保存,全部初始化为'D'NUL
    • 'D'更清晰,可用memset(s, c, n)设置。
    • NUL更方便,写成char tag[N]{};即可。
    • 这两种方式如果不太理解,建议都试一遍。
  • 样例第一组数据读入后的contact数组状态:
    • 为使区分明显,用.代表false,用T代表true
    • 读入全部接触记录后,先根据A类把B类全标记出来,再根据B类从剩余人员中把C类标记出来。

 代码实现(方法1):

#include<stdio.h>
#include<stdlib.h>
void test(int);
char date[15];
typedef struct ArcNode* Arc;
struct ArcNode
{int adjvex;Arc next;
};struct Vnode
{Arc bgn;char type;
};
struct Vnode graph[2001];
void init(int N);
void createNode(int v1,int v2);
void sift(int N);
void Print(int N)
{for(int i=1;i<=N;i++){if(graph[i].type!='D'){printf("%d %c\n",i,graph[i].type);}}return;
}
int main()
{int N,C,P;while(scanf("%s %d%d%d",date,&N,&C,&P)!=EOF){init(N);for(int i=0;i<C;i++){int v1, v2;scanf("%d%d",&v1,&v2);createNode(v1,v2);createNode(v2,v1);}for(int i=0;i<P;i++){int v;scanf("%d",&v);graph[v].type='A';}sift(N);printf("%s\n",date);//test(1);Print(N);}return 0;
}
void init(int N)
{for(int i=1;i<=N;i++){graph[i].bgn=NULL;graph[i].type='D';}return;
}
void createNode(int v1,int v2)
{Arc newnode=(Arc)malloc(sizeof(struct ArcNode));newnode->adjvex=v2;newnode->next=NULL;if(graph[v1].bgn==NULL){graph[v1].bgn=newnode;}else{Arc pre=graph[v1].bgn;Arc cur=pre->next;while(cur!=NULL){pre=cur;cur=cur->next;}pre->next=newnode;}return;
}
void sift(int N)
{for(int i=1;i<=N;i++){//寻找B类型if(graph[i].type=='A'){Arc cur=graph[i].bgn;while(cur!=NULL){int v=cur->adjvex;if(graph[v].type=='D')graph[v].type='B';cur=cur->next;}}}//Print(N);for(int i=1;i<=N;i++){if(graph[i].type=='B'){Arc cur=graph[i].bgn;while(cur!=NULL){int v=cur->adjvex;if(graph[v].type=='D')graph[v].type='C';cur=cur->next;}}}return;
}
void test(int i)
{//调试函数printf("Start to test:\n");Arc cur=graph[i].bgn;while(cur!=NULL){printf("%d %d\n",i,cur->adjvex);cur=cur->next;}return;
}

这篇关于PTA 密接判定v1(close_contact1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424462

相关文章

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

poj 1127 线段相交的判定

题意: 有n根木棍,每根的端点坐标分别是 px, py, qx, qy。 判断每对木棍是否相连,当他们之间有公共点时,就认为他们相连。 并且通过相连的木棍相连的木棍也是相连的。 解析: 线段相交的判定。 首先,模板中的线段相交是不判端点的,所以要加一个端点在直线上的判定; 然后,端点在直线上的判定这个函数是不判定两个端点是同一个端点的情况的,所以要加是否端点相等的判断。 最后

一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程

1.症状 生产环境的一个服务突然无法访问,服务的交互过程如下所示: 所有的请求都是通过网关进入,之后分发到后端服务。 现在的情况是用户服务无法访问商旅服务,网关有大量java.net.SocketTimeoutException: Read timed out报错日志,商旅服务也不断有日志打印,大多是回调和定时任务日志,所以故障点在网关和商旅服务,大概率是商旅服务无法访问导致网关超时。 后

pta-2024年秋面向对象程序设计实验一-java

文章申明:作者也为初学者,解答仅供参考,不一定是最优解; 一:7-1 sdut-sel-2 汽车超速罚款(选择结构) 答案: import java.util.Scanner;         public class Main { public static void main(String[] arg){         Scanner sc=new Scanner(System

Hessian矩阵判定极值之MATLAB实现符号解

By WC 1.9 .2015 1.Hessian矩阵 其定义如下: 如果函数f在D区域内二阶连续可导,那么黑塞矩阵H(f) 在 D 内为对称矩阵。原因是:如果函数f连续,则二阶偏导数的求

delphi : 窗体的close,free,destroy的区别

一、我用application.create(TForm2,Form2)语句,创建了Form2,可是调用了Form2.close后,重新调用Form2.show. 刚才所创建的Form2仍然存在。问为了节约资源,应该怎样使用close,free,destroy. 三者的关系是什么? 1、Action:=caFree。 2、 with TForm1.Create(Application) do

初次用用Spring 和mybatis整合的报出Manual close is not allowed over a Spring managed SqlSession错误

一般这种错误是由于没有删dao实现类中的close,因为框架已经帮你写好了

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

【codeforces】293E. Close Vertices 点分治+树状数组

传送门:【codeforces】293E. Close Vertices 题目分析:找一棵树上有多少条路径长度不超过l且边权和不超过w的路径。 我们用点分治处理。 分治每一层,对每一个重心,预处理出到重心距离d,边权和为w的所有路径。将路径按照w排序,然后我们用双指针扫描数组,同时维护一个树状数组,树状数组中保存的是到重心距离为d的条数。因为有贡献可能来自子树,于是我们对子树进行同样的

【编程基础C++】素数判定、最小公倍数与最大公因数的实现方法

文章目录 素数法一法二 最大公因数辗转相除法另一写法 最小公倍数直接枚举法根据GCD算LCM 素数 素数 是指大于1的自然数,且只能被1和自身整除。例如,2、3、5和7都是素数。它们在数学中非常重要,因为任何大于1的自然数都可以唯一地表示为素数的乘积,这被称为素数分解。 法一 #include <iostream>using namespace std;bool IsPr