CF670A Holidays 题解
Content
假设 \(1\) 年有 \(n\) 天,而每周同样会有 \(5\) 天工作日和 \(2\) 天休假。求一年最小的休假天数和最大休假天数。
数据范围:\(1\leqslant n\leqslant 10^6\)。
Solution
题解区的做法都稍麻烦了些,其实这道题目只需要两行代码就能够搞定。一行输入,一行输出结果。
没听错,一行直接输出答案。原因是这道题目其实是有公式的。
首先我们知道,一年里面有 \(\left\lfloor\dfrac n7\right\rfloor\) 个完整的一周,之前的休假天数就是 \(\left\lfloor\dfrac n7\right\rfloor\times 2\)。
我们想,最小的休假天数无疑是一开始就是工作日,那么剩下来的那一周肯定是先工作日,后休假。具体休假的时间显然由 \(n\mod 7\) 来定。如果 \(n\mod 7\leqslant 5\),那么就没有假期,否则就有假期,因此就相当于先求出 \(n\mod 7-5\) 再和 \(0\) 取最大值,因此最小休假天数是 \(\left\lfloor\dfrac n7\right\rfloor\times 2+\max(n\mod 7-5,0)\)。
再想,最大的休假天数一定是一开始就是休假日,那么剩下来的那一周肯定是先休假,后工作日,同样也是由 \(n\mod 7\) 的值来定。如果 \(n\mod 7<2\),那么假期天数就是 \(n\mod 7\),否则就是 \(2\)(因为之后就是工作日)。因此最大休假天数就是 \(\left\lfloor\dfrac n7\right\rfloor\times 2+\min(n\mod 7,2)\)。
Code
int main() {
int n = Rint;
printf("%d %d", n / 7 * 2 + max(0, n % 7 - 5), n / 7 * 2 + min(n % 7, 2));
return 0;
}
声明一下,为了防止 sbxxs 抄题解,把快读、头文件以及宏定义都省略了。直接交这份代码肯定是没办法编译通过的。