AtCoder 初學(xué)者競(jìng)賽--開(kāi)關(guān)(簡(jiǎn)單題)
作為a題達(dá)人(指只會(huì)做a的人)肯定是要對(duì)這題解釋一波的。話不多說(shuō),上題目了。
翻譯一下題目:
-
Takahashi 每天在S點(diǎn)的時(shí)候在他的房間里開(kāi)關(guān)燈(用的是24小時(shí)制)并且在T點(diǎn)關(guān)燈。
-
當(dāng)關(guān)燈的時(shí)候日期可能改變(可能是第一天開(kāi)的燈,第二天關(guān)的燈)。
-
確定是否這燈在X點(diǎn)30分的時(shí)候還開(kāi)著。
========================================================================
限制條件:
-
給出了變量的范圍因?yàn)槭前?4小時(shí)制來(lái)記的所以0<=S,T,X<=23。
-
S!=T(也就是說(shuō)不可能剛開(kāi)燈就立刻關(guān)燈和開(kāi)關(guān)燈的間隔大于等于24h)
-
所有的值都是整數(shù)型(即開(kāi)關(guān)燈都是在整點(diǎn)進(jìn)行的)
========================================================================
我們來(lái)看一下輸入和輸出的要求:
輸入:三個(gè)數(shù)S T X(S:開(kāi)燈時(shí)間,T:關(guān)燈時(shí)間,X:檢查燈是否亮著的時(shí)間)
輸出:若燈在S到T這兩個(gè)整點(diǎn)區(qū)間內(nèi)還亮著輸出Yes,若燈在這區(qū)間內(nèi)被關(guān)了則輸出No。
========================================================================
題目中給了三個(gè)例子,我們先來(lái)看一下例子。
(1)
輸入 S=7 ,T=20 ,X=12.。
即燈從早上7點(diǎn)開(kāi)到晚上20點(diǎn)(同一天),在中午12:30時(shí)檢查燈未熄滅,所以輸出Yes。
(2)
輸入 S=20 ,T=7, X=12。
即燈從晚上20點(diǎn)開(kāi)到早上7點(diǎn),時(shí)間必不可能倒流,所以這里是不同天:從第一天晚20點(diǎn)開(kāi)到第二天早7點(diǎn),在第二天中午12:30分檢查燈已經(jīng)熄滅,所以輸出No。
(3)
輸入 S=23 ,T=0 ,X=23。
即從晚上23點(diǎn)開(kāi)到0點(diǎn)(已經(jīng)到第二天的開(kāi)始),在23:30檢查燈未熄滅,所以輸出Yes。
========================================================================
下面簡(jiǎn)述一下我的思路:
熄燈和開(kāi)燈的天數(shù)可能相等也可能不等。所以要分類:
(1)當(dāng)開(kāi)關(guān)燈在同一天時(shí),此時(shí)的S<T,而X不確定??赡躕在[S,T]內(nèi),也可能在其外,在內(nèi)則Yes,在外則NO。注意:當(dāng)X=T時(shí),意為在T點(diǎn)30分檢查,此時(shí)燈已經(jīng)熄滅,為No。
(2)當(dāng)開(kāi)關(guān)燈不在同一天時(shí),此時(shí)S>T(若S<T則會(huì)被認(rèn)為是(1)的情況),因X不確定,所以要再對(duì)X進(jìn)行細(xì)分。
1.當(dāng)在第一天進(jìn)行檢查時(shí),X只有一種情況即:X>=S(檢查的時(shí)間必比開(kāi)燈大),X>T(因?yàn)槭?4小時(shí)內(nèi),所以X也必大于T)。此時(shí)輸出Yes。
2當(dāng)在第二天進(jìn)行檢查時(shí),X的范圍就有兩種情況:
第一種為X>=T,此時(shí)輸出No;
第二種為X<T,此時(shí)輸出Yes。
至此分析結(jié)束,下面提供AC代碼(我比較菜就用的if語(yǔ)句)
========================================================================
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)//前三個(gè)if語(yǔ)句是不在同一天開(kāi)關(guān)
{
printf("Yes");
}
else if(S>T && X>=T)
{
printf("No");
}
else if(S>T && X<T)
{
printf("Yes");
}
else if(S<T && X<T)//下面兩個(gè)if語(yǔ)句是在同一天開(kāi)關(guān)
{
printf("Yes");
}
else if(S<T && X>=T)
{
printf("No");
}
}
}
========================================================================
總結(jié)一下:本題難度并不大,主要是要注意對(duì)特殊情況的分類如開(kāi)關(guān)是否在同一天,檢查是否在開(kāi)關(guān)區(qū)間里等等。