题目有点模糊不清
2023-01-17 17:41:06
发布于:浙江
75阅读
0回复
0点赞
题意其实很简单,就是数一数一年里,桥假有多少天。那么这题的关键,就是对桥假的正确理解。
本来洋洋洒洒打了很多字来说这个模糊不清,想想可能有引战嫌疑就算了。仁者见仁智者见智。
这里就点一下题目描述中的桥假含义:桥假是指在周一时或周五时,它相邻的两天是法定假日和周末假日,然后人呢把这一天给主动请假了。
且这里把周末假日优先级高于法定假日,意思是法定假日长度若包含了周末假日,该周末假日只是周末假日,不是法定假日。
最后问的其实是,一年中,可以主动请假请到周一和周五,并构成桥假的日子有多少天。
在测评数据上,根据提交的代码,应该对一月一日没有进行特判吧(周一需要,周五待定,毕竟不知道上一年情况嘛)。
AC 代码如下,可供参考。
#include <iostream>
using namespace std;
struct Date {
int xq;
int flag;
} year[400];
int theDay(int m, int d, char f) {
int s = 0;
for (int i=1; i<m; i++) {
if (i==1 || i==3 || i==5 || i==7 || i==8 || i==10) {
s += 31;
} else if (i==2) {
if (f=='Y') s += 29;
else s += 28;
} else {
s += 30;
}
}
s += d;
return s;
}
int main() {
int e = 365;
char ch;
cin >> year[1].xq >> ch;
if (ch=='Y') e = 366;
for (int i=2; i<=e; i++) {
year[i].xq = year[i-1].xq%7+1;
if (year[i].xq==6 || year[i].xq==7) year[i].flag = 1;
else year[i].flag = 0;
}
/*
周末日: 1
工作日:0
法定假日:2
*/
int n;
cin >> n;
for (int i=1; i<=n; i++) {
int m, d, l;
cin >> m >> d >> l;
int idx = theDay(m, d, ch);
// year[idx] 是开始放假的日子,后一天开始法定假日
for (int j=idx; j<idx+l; j++) {
year[j].flag = 2;
}
}
int ans = 0;
// 未考虑第一天周五,第一天周一
/*
if (year[1].xq==1 && year[1].flag==2 && year[2].flag==0) {
ans++;
}
if (year[1].xq==5 && year[i].flag==0 && year[2].flag==1) {
ans++;
} // 第一天周五?
*/
/* 桥假期,这一天不放假,但是两端放假 */
for (int i=2; i<=e; i++) {
if (year[i].xq==1 && year[i].flag==0) {
if (/*year[i-1].flag==1 && */year[i+1].flag==2) ans++;
}
if (year[i].xq==5 && year[i].flag==0) {
if (year[i-1].flag==2 /*&& year[i+1].flag==1*/) ans++;
}
}
cout << ans << endl;
return 0;
}
全部评论 1
其实在人家国家,桥假是自动放,不用请假,默认每个人都知道这事。扎心了嗷
2023-01-28 来自 浙江
0
有帮助,赞一个