#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n,a,b,x;
cin >> n >> a >> b;
for(int i=1;i<=n-2;i++)
cin >> x;
if(n==2&&b>a+1) cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
// 处理单个测试用例的函数
void solve() {
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2; // 读取两个区间 [l1, r1] 和 [l2, r2]
// 为了方便处理,始终保证 l1 <= l2
if (l1 > l2) swap(l1, l2), swap(r1, r2);
// 如果 Bob 的起点在 Alice 的终点之后,需要锁定一扇门(即 l2 > r1 + 1)
int res = (l2 > r1 + 1);
// 遍历所有可能的门位置 i
for (int i = 1; i <= 100; i++) {
// 如果 i 是区间 [l1, r1] 的一个房间,且 i+1 是区间 [l2, r2] 的一个房间
// 或者 i 是区间 [l2, r2] 的一个房间,且 i+1 是区间 [l1, r1] 的一个房间
// 那么他们之间的门必须上锁
if ((i >= l1 && i <= r1 && i + 1 >= l2 && i + 1 <= r2) ||
(i >= l2 && i <= r2 && i + 1 >= l1 && i + 1 <= r1))
res++; // 需要锁定这扇门
}
// 输出结果
cout << res << endl;
}
signed main() {
// 优化输入输出
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int t; // 测试用例数量
cin >> t;
while (t--) { // 处理每个测试用例
solve();
}
return 0;
}
代码讲解:
- 区间交换:为了方便处理,代码确保
l1 <= l2
,如果不是则交换两个区间。 - 最小门数判断:
- 如果两个区间完全不重叠(即
l2 > r1 + 1
),那么至少需要锁定一扇门(即 Alice 的房间段的末端和 Bob 的房间段的起点之间的门)。 - 通过遍历房间序列,从
1
到100
检查每扇门是否在两个区间之间的边界上,如果是,则增加需要锁定的门数。
- 如果两个区间完全不重叠(即
- 结果输出:输出需要锁定的最小门数。
这个代码解决了问题B "Game with Doors",通过贪心策略找出了需要锁定的最少门数来防止Alice和Bob的相遇。
代码执行步骤:
-
第一步:读取测试用例数量
int t;
cin >> t;
- 代码读取输入的第一行
4
,将其存储到变量t
中,表示有4个测试用例。
-
第二步:循环处理每个测试用例
- 代码进入
while (t--)
循环,用于处理每个测试用例。每次循环都会调用solve()
函数来处理一个测试用例。
- 代码进入
第一个测试用例(对应输入 1 2
和 3 4
):
-
读取两个区间
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
- 代码读取
1 2
和3 4
,将它们分别存储在变量l1, r1, l2, r2
中,即l1=1
,r1=2
,l2=3
,r2=4
。
-
确保区间顺序
if (l1 > l2) swap(l1, l2), swap(r1, r2);
- 检查
l1
是否大于l2
,如果是,则交换两个区间的值。但是在这个例子中l1=1
小于l2=3
,因此无需交换。
-
判断是否需要锁门
int res = (l2 > r1 + 1);
- 代码计算
l2 > r1 + 1
是否成立。在这个例子中3 > 2 + 1
不成立,因此res = 0
。
-
遍历检查所有可能的门
- 代码进入循环
for (int i = 1; i <= 100; i++)
,从房间1到房间100逐个检查每扇门。 - 在这里,代码找到房间
2
和房间3
之间的门属于两个区间之间的边界,因此将res
增加 1。 - 最后
res = 1
,表示至少需要锁定1扇门。
- 代码进入循环
-
输出结果
cout << res << endl;
- 代码输出
1
作为第一个测试用例的答案。
第二个测试用例(对应输入 2 5
和 2 5
):
-
读取两个区间
cin >> l1 >> r1 >> l2 >> r2;
- 代码读取
2 5
和2 5
,将它们分别存储在变量l1, r1, l2, r2
中,即l1=2
,r1=5
,l2=2
,r2=5
。
-
确保区间顺序
if (l1 > l2) swap(l1, l2), swap(r1, r2);
l1=2
和l2=2
,因此无需交换。
-
判断是否需要锁门
int res = (l2 > r1 + 1);
2 > 5 + 1
不成立,因此res = 0
。
-
遍历检查所有可能的门
- 代码在遍历中发现多个门都属于两个区间之间的边界:
- 房间
4
和5
之间 - 房间
3
和4
之间 - 房间
2
和3
之间
- 房间
- 因此将
res
累加 3,得到res = 3
。
- 代码在遍历中发现多个门都属于两个区间之间的边界:
-
输出结果
- 代码输出
3
作为第二个测试用例的答案。
- 代码输出
第三个测试用例(对应输入 3 7
和 6 7
):
-
读取两个区间
cin >> l1 >> r1 >> l2 >> r2;
- 代码读取
3 7
和6 7
,将它们分别存储在变量l1, r1, l2, r2
中,即l1=3
,r1=7
,l2=6
,r2=7
。
-
确保区间顺序
if (l1 > l2) swap(l1, l2), swap(r1, r2);
l1=3
小于l2=6
,因此无需交换。
-
判断是否需要锁门
int res = (l2 > r1 + 1);
6 > 7 + 1
不成立,因此res = 0
。
-
遍历检查所有可能的门
- 代码在遍历中发现:
- 房间
6
和房间7
之间的门属于两个区间之间的边界 - 房间
5
和房间6
之间的门属于两个区间之间的边界
- 房间
- 因此将
res
累加 2,得到res = 2
。
- 代码在遍历中发现:
-
输出结果
- 代码输出
2
作为第三个测试用例的答案。
- 代码输出
第四个测试用例(对应输入 4 5
和 2 8
):
-
读取两个区间
cin >> l1 >> r1 >> l2 >> r2;
- 代码读取
4 5
和2 8
,将它们分别存储在变量l1, r1, l2, r2
中,即l1=4
,r1=5
,l2=2
,r2=8
。
-
确保区间顺序
if (l1 > l2) swap(l1, l2), swap(r1, r2);
- 因为
l1 > l2
(即4 > 2
),代码会交换两个区间,得到l1=2
,r1=8
,l2=4
,r2=5
。
-
判断是否需要锁门
int res = (l2 > r1 + 1);
4 > 8 + 1
不成立,因此res = 0
。
-
遍历检查所有可能的门
- 代码在遍历中发现:
- 房间
3
和房间4
之间的门属于两个区间之间的边界 - 房间
2
和房间3
之间的门属于两个区间之间的边界
- 房间
- 因此将
res
累加 2,得到res = 2
。
- 代码在遍历中发现:
-
输出结果
- 代码输出
2
作为第四个测试用例的答案。
- 代码输出
总结:
每个测试用例的输出都依赖于代码对给定区间的处理和对各个门是否在两个区间之间边界的判断。最终的结果会输出需要锁定的最少门数以确保Alice和Bob无法互相到达对方所在的房间。