一道考试模拟题:
小明在小区里开了一家便利店,每位顾客进店时都要扫码,总共有 A到Z 26 位顾客;他收集到了一天内的扫码信息,格式为:
A 10:10,代表 A 这位顾客的进店时间为 10:10;这里时间最小为 00:00,最大为 23:59
对于某位顾客 A,他的【密切接触者】定义为在他进店时间之前 1小时、之后 1小时内进店的所有其他顾客,比如 A 在 10:10 进店,那么进店时间在 09:10~11:10 时段内的所有其他顾客都是 A 的密切接触者(注意 A 自己不计入在内)。
一天内顾客可以多次进店,请你根据扫码信息,统计每位顾客的密切接触者总人数。
第一行 1个正整数 n,代表扫码信息的条数。
接下来 n行,每行 2 个字符串格式形如 A 10:10,代表一条扫码信息,保证顾客姓名为单个大写字母。
输出 26 行,代表顾客 A~Z 的答案,若这位顾客从未进店过,直接输出 0,否则输出他的密切接触者总人数。
20
V 04:22
G 04:49
E 00:20
G 09:47
J 00:51
P 00:27
O 02:19
E 05:01
Q 08:37
C 03:54
G 06:33
F 02:46
N 06:57
S 02:03
C 05:38
A 04:06
T 08:35
O 01:26
P 09:17
N 03:37
5
0
5
0
6
3
6
0
0
3
0
0
0
5
4
6
2
0
2
2
0
5
0
0
0
0
用2维数组存储,没成功(我自己不会)。
不会存“:”。
有没有人可以告诉我怎么做,且思路是什么?
谢谢了Thanks♪(・ω・)ノ
思路参考:
1、创建顾客结构体保存信息,字段包括如下:
char name // 名字
int hour // 小时
int minute // 分钟
int totalMinute // 小时切换成分钟与分钟和 以便于进行比较前后60分钟
2、数组存输入信息之后进行排序
3、可以定义一个整型数组int client[26]存个人的密接次数
4、对排序之后的输入信息开始遍历进行计算密接次数,并将计算的值存入client相对应的位置。
5、遍历client输出即可
这一题分为三个部分:
对于第一部分,我们可以先用getchar()或者特定函数读取名字,然后再用scanf中的格式化输入解决后面的HH:MM格式。
对于第二部分,我们枚举两个人,判断是否为密接(即时间差<=60minute),如果是,记bz[i][j]表示i与j的关系,则bz[i][j]=1。
对于第三部分,我们先枚举一个人,然后枚举所有可能的人,判断关系并累加。
因为是一天的记录,所以不用处理跨天的情况(即23:59->00:01)。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int bz[200][200],ans[200],n;
char name[1005];
int times[1005];
char C()//过滤读入,可以直接放进for循环里面
{
char ch=getchar();
while(!(ch>='A'&&ch<='Z'))ch=getchar();//非法字符不读入
return ch;//返回一个合法字符
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int s,t;
name[i]=C();
scanf("%2d:%2d",&s,&t);//格式化读入,例:%d-%d可以读入H-M的格式,%1d可以读入长度为1的int类型
times[i]=s*60+t;//小时化成分钟
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)//枚举两个人
if(abs(times[i]-times[j])<=60)bz[name[i]][name[j]]=bz[name[j]][name[i]]=1;//判断是否密接
for(int i='A';i<='Z';i++)//枚举一个人
{
for(int j='A';j<='Z';j++)//枚举任意一个人
if(i!=j)ans[i]+=bz[i][j];//如果是密接,则答案加一
printf("%d\n",ans[i]);//输出答案
}
}