week4-[循环结构]生日悖论-new
week4-[循环结构]生日悖论-new
题目背景
小明最近学习了生日悖论。生日悖论是说,在不少于23人的班级中,存在两个人在同一天生日的概率大于50%。小明感到这很有趣,于是他进一步考虑下面的问题。
题目描述
小红、小方和小明是好朋友,他们正好都在 2012 年 3 月出生。现在需要考虑他们三个人是否存在生日悖论的现象。
现在知道小红的生日日期为 aaa 到 bbb 之间一个数(包括 aaa 和 bbb),小方的生日日期为 ccc 到 ddd 之间的一个数(包括 ccc 和 ddd),小明的生日日期为 eee 到 fff 之间的一个数(包括 eee 和 fff)。
现在想知道,三个人中,有多少种情况满足至少有两个人在同一天生日呢?
输入格式
输入包括 333 行,每行包括 222 个整数,数字之间使用一个空格隔开。
第一行包含整数 a,ba,ba,b,表示小红的生日为 333 月 aaa 日到 333 月 bbb 日之间一个数;
第二行包含整数 c,dc,dc,d,表示小方的生日为 333 月 ccc 日到 333 月 ddd 日之间一个数;
第三行包含整数 e,fe,fe,f,表示小明的生日为 333 月 eee 日到 333 月 fff 日之间一个数。
输出格式
输出只有一行,该行只有1个整数,表示有多少种情况满足至少有两个人在同一天生日。
样例 #1
样例输入 #1
3 4
2 3
4 5
样例输出 #1
4
样例 #2
样例输入 #2
1 5
6 10
11 15
样例输出 #2
0
样例 #3
样例输入 #3
1 28
1 10
11 20
样例输出 #3
200
样例 #4
样例输入 #4
3 5
3 9
1 10
样例输出 #4
66
提示
样例解释1
小红、小方和小明的生日日期全部可能性包括以下8种:
小红 | 小方 | 小明 | 是否有两人生日相同 |
---|---|---|---|
3 日 | 2 日 | 4 日 | 否 |
3 日 | 2 日 | 5 日 | 否 |
3 日 | 3 日 | 4 日 | 是 |
3 日 | 3 日 | 5 日 | 是 |
4 日 | 2 日 | 4 日 | 是 |
4 日 | 2 日 | 5 日 | 否 |
4 日 | 3 日 | 4 日 | 是 |
4 日 | 3 日 | 5 日 | 否 |
其中有 444 种情况满足至少有两个人在同一天生日。
数据范围
对于所有数据,满足 a,b,c,d,e,fa,b,c,d,e,fa,b,c,d,e,f 为 111 到 313131 之间的一个整数,且满足 a≤ba\le ba≤b,c≤dc\le dc≤d,e≤fe\le fe≤f。
这道题其实是一个枚举 + 计数的问题。因为日期范围最大是 31 天,三个人各自的生日区间最多长度 31,所以最多情况数为 313=2979131^3=29791313=29791,完全可以直接暴力枚举。
🔎 解题思路
- 输入三个人各自的生日范围:
- 小红:a∼ba \sim ba∼b
- 小方:c∼dc \sim dc∼d
- 小明:e∼fe \sim fe∼f
- 枚举三重循环:
x
遍历 a∼ba \sim ba∼b(小红生日)y
遍历 c∼dc \sim dc∼d(小方生日)z
遍历 e∼fe \sim fe∼f(小明生日)
- 判断是否满足至少两个人生日相同:
- 条件为
(x == y) || (y == z) || (x == z)
- 如果满足,就让计数器
cnt++
。
- 条件为
- 输出
cnt
。
📝 C++ 实现
#include <iostream>
using namespace std;int main() {int a, b, c, d, e, f;cin >> a >> b;cin >> c >> d;cin >> e >> f;int cnt = 0;for (int x = a; x <= b; x++) {for (int y = c; y <= d; y++) {for (int z = e; z <= f; z++) {if (x == y || y == z || x == z) {cnt++;}}}}cout << cnt << endl;return 0;
}