题目描述
叶子是一只时间观念很强的小狮子。
它会在 t 时刻发出第一声怒吼。
接着每隔 s 秒,它会发出两声怒吼,时间间隔为 1 秒。
形式化的来说,叶子会在以下时刻发出怒吼:t,t+s,t+s+1,t+2s,t+2s+1…
小林非常喜欢动物,他想在 x 时刻去摸叶子,但是在狮子怒吼的时候去摸它是一件非常危险的事情。
所以他想请你告诉他在 x 时刻,叶子会不会怒吼。
输入格式
一行三个整数,t,s 和 x。分别表示叶子第一次怒吼的时间、怒吼的间隔和小林想去摸叶子的时刻。
输出格式
如果叶子会在 x 时刻怒吼,则输出 YES,否则输出 NO。
数据范围
0≤t,x≤109,
2≤s≤109
输入样例1:
3 10 4
输出样例1:
NO
输入样例2:
3 10 3
输出样例2:
YES
输入样例3:
3 8 51
输出样例3:
YES
输入样例4:
3 8 52
输出样例4:
YES
算法1
时间复杂度 O(1)
有题目可知,狮子会吼叫只在这3种情况下会出现:
1.t时刻
2.t+ks(k>=1)
3.t+ks+1(k>=1)
所以这道题就转换成了判断x是否为其这三种情况的倍数即可
错误样例:
比如:3 10 4
根据所给代码(x-t-1)会出现0的情况使其为YES;但实际上是不可的
这种错误的情况只发生在x-t-1=0的情况上,所以+上不等于0的条件即可
C++ 代码
#include<iostream>
using namespace std;
int main()
{
int t,s,x;
cin>>t>>s>>x;
if(x==t) cout<<"YES";//如果x刚好等于t时刻直接就给怒吼
else
{
//根据情况2和情况3写出表达式,但是不能为0,可看错误样例
if((x-t)%s==0&&(x-t)!=0||(x-t-1)%s==0&&(x-t-1)!=0) cout<<"YES";
else cout<<"NO";
}
return 0;
}