题目描述:
公司用一个字符串来表示员工的出勤信息:
absent: 缺勤
late:迟到
leaveearly: 早退
present: 正常上到
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
1. 缺勤不超过一次;
2. 没有连续的迟到早退;
3. 任意连续7次考勤,缺勤迟到/早退不超过3次;
输入描述:
第一行输入一个整数n,表示有多少个员工;
第二行输入若干个字符串,即员工考勤状态,表示第1名员工的出勤信息;
第三行输入若干个字符串,即员工考勤状态,表示第2名员工的出勤信息;
...
第N+1行输入若干个字符串,即员工考勤状态,表示第N名员工的出勤信息;
输出描述:
将每个员工的全勤状态记录在一个全勤数组中,并依次输出。该数组中的每个元素对应的每位员工能否获得出勤奖状态;如果可以,则输出“true",否则输出”false";
示例1:
输入
2
present
present present
输出
true true
示例2:
输入
2
present
present absent present present leaveearly present absent
输出
true false
C++源码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
//const int MAX_LENGTH = 2e5 + 5; // 更改最大长度常量名称
// 重命名函数和变量
vector<string> string2workState() {
string before;
getline(cin, before);
istringstream lineStream(before);
vector<string> workState;
string workerState;
while (s >> workerState)
workState.push_back(workerState);
return workState;
}
int main() {
int workers;
cin >> workers;
cin.ignore(); // 替换getchar()以读取并丢弃换行符
vector<string> tempStr(workers);
// 使用for循环替换while循环
for (int i = 0; i < workers; ++i) {
vector<string> worker = string2workState();
bool forAward = true;
int absenceCount = 0;
// 遍历考勤记录
for (int k = 0; k < worker.size(); ++k) {
if (worker[k] == "leaveearly")
worker[k] = "late";
absenceCount += worker[k] == "absent";
// 检查是否有连续迟到
if (k > 0 && worker[k] == "late" && worker[k - 1] == "late")
forAward = false;
// 检查任意连续7次考勤中不良记录是否超过3次
if (k >= 6) {
int presentCount = 0;
for (int j = 0; j < 7; ++j)
presentCount += worker[k - j] == "present";
if (presentCount < 4)
forAward = false;
}
}
// 检查缺勤次数是否超过一次
if (absenceCount > 1)
forAward = false;
tempStr[i] = forAward;
if (forAward) {
tempStr[i] = "true";
}
else {
tempStr[i] = "false";
}
}
for (int i = 0; i < tempStr.size(); i++)
{
cout << tempStr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}