题目描述
公司用一个字符串来表示员工的出勤信息
- absent:缺勤
- late: 迟到
- leaveearly: 早退
- present: 正常上班
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
- 缺勤不超过一次,
- 没有连续的迟到/早退:
- 任意连续7次考勤,缺勤/迟到/早退不超过3次
输入描述
第一行输入一个整数
n
,表示有多少个员工后面
n
行,每一行输入若干个字符串,表示第i
名员工的出勤信息输出描述
输出
n
行,每一行表示这名员工能否获得出勤奖,如果可以,则输出“true",否则输出”false"示例1
输入: 2 present present present输出: true true
示例2
输入: 2 present present absent present present leaveearly present absent输出: true false
作者:code5bug
链接:考勤信息 - 华为OD统一考试(C卷)_牛客网
来源:牛客网
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.对n个员工的出勤情况做一个评估,是否可以获得出勤奖励
2.absent表示缺勤,late表示迟到,leaveearly表示早退,present表示正常上班
3.如果想要获得出勤奖励需要满足:
(1)缺勤不超过一次
(2)没有连续的迟到/早退
(3)任意连续7次考勤,缺勤/迟到/早退不超过3次
4.输入描述:输入一个正整数n表示员工数量,后面n行表示第i名员工的出勤信息
5.输出描述:输出n行每行表述员工是否能获得出勤奖,如果可以输出true不可以输出false
二、解题思路
1.首先定义一个整数变量int n;用来存储员工数量
2.然后对于每一名员工,我们接收他的出勤信息并存储到一个字符串char info[1000];中
fgets(info, sizeof(info), stdin);
info[strcspn(info, '\n')] = '\0';
3.我们对出勤信息进行一个统计,首先定义一个变量统计缺勤次数int absent = 0;
4.还需要定义一个变量表示连续迟到或者早退int lateleavearly = 0;(每次遇到late和leaveearly的时候增加1,如果变成2我们认为不能获得出勤奖)
5.还需要一个记录连续7次缺勤/迟到/早退的次数不超过三次的方法,我们可以用一个数组表示
int idx = 0;
bool week[7] = {false};首先我们初始化为0,表示没有缺勤
6.然后在处理出勤信息的时候,做一个判断
if(idx == 6) idx = 0;
如果已经到了第七天我们将索引变回第一天
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{int n;scanf("%d", &n);for(int i = 0; i < n; i++) {char info[1000];fgets(info, sizeof(info), stdin);info[strcspn(info, "\n")] = '\0';bool absent = false;bool attandance = true;bool lateleaveearly = false;bool week[7] = {false};int idx = 0;int threetime = 0;char* temp = strtok(info, " ");while(temp != NULL) {if(strcmp(temp,"absent") == 0) {if(absent == true) {attandance = false;} else {absent = true;lateleaveearly = false;}} else if(strcmp(temp, "late") == 0 || strcmp(temp,"leaveearly") == 0) {if(lateleaveearly == true) attandance = false;else lateleaveearly = true;} else if(strcmp(temp, "present") == 0) {lateleaveearly = false;}if(attandance == false) break;else {if(week[idx] == 1) threetime--;if(strcmp(temp,"absent") == 0 || strcmp(temp,"late") == 0 || strcmp(temp,"leaveearly") == 0) {week[idx++] = 1;threetime++;if(threetime >= 3) attandance = false;} else { // 其他情况应该只有出席week[idx++] = 0;}if(idx == 7) idx = 0;}if(attandance == false) break;temp = strtok(NULL, " ");}if(attandance == false) printf("false\n");else printf("true\n");}return 0;
}