題目描述
公司用一個字符串來表示員工的出勤信息
- 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;
}