2 条题解
-
0
#include<iostream> using namespace std; int main(){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if(x==y){ printf("No"); }else if(z==y && x!=y){ printf("Yes"); return 0; } while(y!=z){ if(y+1==24){ y=0; if(y==x){ printf("No"); return 0; } }else{ y++; if(y==x){ printf("No"); return 0; } } } printf("Yes"); return 0; } -
0
📝 题目大意
一天有 24 小时,高桥君在 点睡觉、 点醒来(睡眠时间不足 24 小时),居民在 点表达对章鱼小丸子的爱。判断高桥君在 点时是否醒着(即不在睡觉)。
💡 解题思路
-
题目分析:
- ,且三者互不相同,睡眠时间少于 24 小时。
- 核心难点在于睡眠区间可能跨过零点(如 ,即从晚上 9 点睡到第二天早上 7 点)。
- 数据范围极小(),直接枚举或区间判断均可。
-
算法推导:
- 统一处理跨天:若 (跨零点),则令 ,将睡眠区间统一表示在 的扩展时间轴上,此时睡眠区间为 且长度 。
- 判断是否清醒: 时刻醒着,等价于 不在睡眠区间 内。但由于睡眠区间可能跨过 ,需要从两个角度检查:
- 当天视角: 是否不在 内 →
a < b || a > c - 次日视角: 是否不在 内 →
a + 24 < b || a + 24 > c
- 当天视角: 是否不在 内 →
- 两个条件同时成立时, 一定在清醒时段内,输出
Yes;否则输出No。 - 等价理解:
- 若不跨天():清醒条件为 或 ,此时
a+24条件恒成立(因为 )。 - 若跨天( 调整后):清醒条件为 ,恰好对应两个条件分别化简为
a < b和a > c - 24。
- 若不跨天():清醒条件为 或 ,此时
-
边界与细节:
- 注意 调整后可能 ,比较时直接使用整数即可。
- 睡眠时间少于 24 小时保证调整后 ,因此 和 不可能同时落在 内。
⏱️ 复杂度分析
- 时间复杂度:,仅常数次比较和布尔运算。
- 空间复杂度:,仅使用几个整型变量。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main() { int a,b,c;cin>>a>>b>>c; // 若睡眠跨过零点(B > C),将 C 加上 24 统一处理 if(b>c)c+=24; // 同时检查当天 A 和次日 A+24 是否都不在睡眠区间 [B, C] 内 if((a<b||a>c)&&(a+24<b||a+24>c))puts("Yes"); else puts("No"); return 0; } -
- 1
信息
- ID
- 818
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 2
- 上传者