这道题我一看,那么长…,结果就是一个模拟题;
这道题如果都把他化成秒就很好算了,因为题目有规定输入的时间不会发生冲突;
所以我直接比较秒的大小就行了;
主要是题意的理解:
1.如果在白班换岗,那么就是必须在9:30之前到岗,否则就迟到了;并且在到岗后必须值班至少8个小时
2.如果在晚班换岗,那么就必须在12:30之前到岗,否则就是迟到了;并且在到岗后必须值班至少9个小时
3.在一天内,如果迟到,那么记一分,如果没有值到相应的时间那么就会记一分,但是有个特列在题目中说了:如果一天内,迟到+没有值到应有时间的班那么只记一分;
如果总的计分>3了,那么就是输出:
Issue Show Cause Letter
如果总计分<=3,那么就输入相应的值;
如果总计分为0了,那么就输出All OK;
所以这就是一道英语阅读题;
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int endt,startt;//每个天对应的开始时间和结束时间
int _9_30=34200,_8_30=30600;
int _8=28800,_9=32400;
int _12_30=45000;
void change(string s){//转化时间
int f1=1,f2=1,f3=1,f4=1,f5=1,f6=1;
for(int i=s.length()-1;i>=1;i--){
if(s[i]==':'&&f1){
f1=0;
int t=0;
for(int j=i+1;j<=i+2;j++){
t=t*10+(s[j]-'0');
}
endt+=t;
}else if(s[i]==':'&&f2){
int t=0;
f2=0;
for(int j=i+1;j<=i+2;j++){
t=t*10+s[j]-'0';
}
endt+=t*60;
}else if(s[i]==':'&&f3){
f3=0;
//找后面第一个:
int b;
for(int j=i+1;j<s.length()-1;j++){
if(s[j]==':'){
b=j;break;
}
}
int t=0;
for(int j=i+1;j<b;j++){
t=t*10+s[j]-'0';
}
endt+=t*60*60;
}else if(s[i]==':'&&f4){
f4=0;
int t=0;
for(int j=i+1;j<=i+2;j++){
t=t*10+s[j]-'0';
}
startt+=t;
}else if(s[i]==':'&&f5){
f5=0;
int t=0;
for(int j=i+1;j<=i+2;j++){
t=t*10+s[j]-'0';
}
startt+=t*60;
}else if(s[i]==':'&&f6){
f6=0;
//找后面第一个:
int b;
for(int j=i+1;j<s.length()-1;j++){
if(s[j]==':'){
b=j;break;
}
}
int t=0;
for(int j=i+1;j<b;j++){
t=t*10+s[j]-'0';
}
startt+=t*60*60;
}
}
}
int main()
{
int n;
while(cin>>n){
if(n==0)break;
string s;
int late=0,fail=0;
int rule=0;
int letter=0;
while(n--){
startt=0;endt=0;
int late_1=0,fail_1=0;
cin>>s;
change(s);
// cout<<startt<<" "<<endt<<endl;
if(s[0]=='D'){
if(startt<=_9_30){//说明没有迟到
//因为在_8_30之前不算如时间,所以这里需要比个大小
int start_t=max(_8_30,startt);
int sub=endt-start_t;
if(sub<_8){//说明没有完成至少8个小时的站岗
fail_1=1;
}
}else{//迟到
late_1=1;
int sub=endt-startt;
if(sub<_8){//说明没有完成至少8个小时的站岗
fail_1=1;
}
}
}else {
if(startt<=_12_30)//说明没有迟到
{
int start_t=max(_8_30,startt);
int sub=endt-start_t;
if(sub<_9){//说明没有完成9小时的站岗任务
fail_1=1;
}
}else{
late_1=1;
int sub=endt-startt;
if(sub<_9){
fail_1=1;
}
}
}
if(late_1&&fail_1){//同一天出现两种情况,那么只记一次分
late++;
}else{
late+=late_1;fail+=fail_1;
}
}
if(late+fail>3)letter=1;
if(letter){
printf("Issue Show Cause Letter\n");
}else if(late||fail){
printf("%d Point(s) Deducted\n",min(3,late+fail));
}else{
printf("All OK\n");
}
// if(letter){
// printf("")
// }
}
return 0;
}