问题描述
题目大意
输入
n 和
d , 能否找到
x 使得
x+⌈x+1d⌉≤n,(x≤n)
如果可以就输出"YES",否则输出"NO"。
题目解析
这是一道有意思的题目,用上了高中的函数最值问题的求解。
令
f(x)=x+⌈x+1d⌉,x≤n
问题就转换为,判断
f(x)min≤n是否成立。
我们先忽略向上取整符号,只要最后
f(x) 的结果向上取整就可以了。
令
u=x+1,u≤n+1
于是,
f(u)=u+ud−1,u≤n+1
我们对
f(u) 求导,得
f′(u)=1−u2d
令
f′(u)=0,得
u=d
,x=d
+1
当
u>d
时,
f′(u)>0,
f′(u)单调递增。
当
u<d
时,
f′(u)<0,
f′(u)单调递减。
所以
x=d
+1 时,
f(x)取得最小值,
f(x)min=2d
−1,只要判断
2d
−1≤n是否成立即可。
看似推导过程很长,但是只要是考过高考的人其实也就是两分钟的事情,还好我高中的东西还没有还给老师hhh。
题目代码
#include <bits/stdc++.h>
using namespace std;
int T, s, d;
int ok(int n, int d) {
return ceil(2.0 * sqrt(d) - 1) <= n;
}
int main()
{
cin >> T;
while(T--) {
cin >> n >> d;
if (d <= n || ok(n, d))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}