作为a题达人(指只会做a的人)肯定是要对这题解释一波的。话不多说,上题目了。

alt

翻译一下题目:

  1. Takahashi 每天在S点的时候在他的房间里开关灯(用的是24小时制)并且在T点关灯。

  2. 当关灯的时候日期可能改变(可能是第一天开的灯,第二天关的灯)。

  3. 确定是否这灯在X点30分的时候还开着。

========================================================================

限制条件:

  1. 给出了变量的范围因为是按24小时制来记的所以0<=S,T,X<=23。

  2. S!=T(也就是说不可能刚开灯就立刻关灯和开关灯的间隔大于等于24h)

  3. 所有的值都是整数型(即开关灯都是在整点进行的

========================================================================

我们来看一下输入和输出的要求:

alt

输入:三个数S T X(S:开灯时间,T:关灯时间,X:检查灯是否亮着的时间)

输出:若灯在S到T这两个整点区间内还亮着输出Yes,若灯在这区间内被关了则输出No。

========================================================================

题目中给了三个例子,我们先来看一下例子。

(1)

alt

输入 S=7 ,T=20 ,X=12.。

即灯从早上7点开到晚上20点(同一天),在中午12:30时检查灯未熄灭,所以输出Yes。

(2) alt

输入 S=20 ,T=7, X=12。

即灯从晚上20点开到早上7点,时间必不可能倒流,所以这里是不同天:从第一天晚20点开到第二天早7点,在第二天中午12:30分检查灯已经熄灭,所以输出No。

(3) alt 输入 S=23 ,T=0 ,X=23。

即从晚上23点开到0点(已经到第二天的开始),在23:30检查灯未熄灭,所以输出Yes。

========================================================================

下面简述一下我的思路:

熄灯和开灯的天数可能相等也可能不等。所以要分类:

(1)当开关灯在同一天时,此时的S<T,而X不确定。可能X在[S,T]内,也可能在其外,在内则Yes,在外则NO。注意:当X=T时,意为在T点30分检查,此时灯已经熄灭,为No

(2)当开关灯不在同一天时,此时S>T(若S<T则会被认为是(1)的情况),因X不确定,所以要再对X进行细分。

1.当在第一天进行检查时,X只有一种情况即:X>=S(检查的时间必比开灯大),X>T(因为是24小时内,所以X也必大于T)。此时输出Yes。

2当在第二天进行检查时,X的范围就有两种情况:

第一种为X>=T,此时输出No;

第二种为X<T,此时输出Yes。

至此分析结束,下面提供AC代码(我比较菜就用的if语句)

========================================================================

using namespace std;
int main()
{
	int S,T,X;
	scanf("%d %d %d",&S,&T,&X);//0≤S,T,X≤23
	 if(S,T,X>=0 && S,T,X<=23 && S!=T) 
	 {
	 	if(S>T && X>T && X>=S)//前三个if语句是不在同一天开关
	 	{
	 		printf("Yes");
		 }
	 	else if(S>T && X>=T)
	 	{
	 		printf("No");
		 }
		else if(S>T && X<T)
		{
			printf("Yes");
		}
		else if(S<T && X<T)//下面两个if语句是在同一天开关
		{
			printf("Yes");
		}
		else if(S<T && X>=T)
		{
			printf("No");
		}
	
	 }
}

========================================================================

总结一下:本题难度并不大,主要是要注意对特殊情况的分类如开关是否在同一天,检查是否在开关区间里等等。