AtCoder 初学者竞赛--开关(简单题)
作为a题达人(指只会做a的人)肯定是要对这题解释一波的。话不多说,上题目了。
翻译一下题目:
-
Takahashi 每天在S点的时候在他的房间里开关灯(用的是24小时制)并且在T点关灯。
-
当关灯的时候日期可能改变(可能是第一天开的灯,第二天关的灯)。
-
确定是否这灯在X点30分的时候还开着。
========================================================================
限制条件:
-
给出了变量的范围因为是按24小时制来记的所以0<=S,T,X<=23。
-
S!=T(也就是说不可能刚开灯就立刻关灯和开关灯的间隔大于等于24h)
-
所有的值都是整数型(即开关灯都是在整点进行的)
========================================================================
我们来看一下输入和输出的要求:
输入:三个数S T X(S:开灯时间,T:关灯时间,X:检查灯是否亮着的时间)
输出:若灯在S到T这两个整点区间内还亮着输出Yes,若灯在这区间内被关了则输出No。
========================================================================
题目中给了三个例子,我们先来看一下例子。
(1)
输入 S=7 ,T=20 ,X=12.。
即灯从早上7点开到晚上20点(同一天),在中午12:30时检查灯未熄灭,所以输出Yes。
(2)
输入 S=20 ,T=7, X=12。
即灯从晚上20点开到早上7点,时间必不可能倒流,所以这里是不同天:从第一天晚20点开到第二天早7点,在第二天中午12:30分检查灯已经熄灭,所以输出No。
(3) 输入 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");
}
}
}
========================================================================
总结一下:本题难度并不大,主要是要注意对特殊情况的分类如开关是否在同一天,检查是否在开关区间里等等。