CF#1288A Deadline (函数求最值问题)
问题描述
题目大意
输入 nnn 和 ddd , 能否找到 xxx 使得 x+⌈dx+1⌉≤n,(x≤n)x+ \lceil \frac{d}{x+1} \rceil \leq n \, ,(x \leq n)x+⌈x+1d⌉≤n,(x≤n)
如果可以就输出"YES",否则输出"NO"。
题目解析
这是一道有意思的题目,用上了高中的函数最值问题的求解。
令f(x)=x+⌈dx+1⌉,x≤nf(x)=x+ \lceil \frac{d}{x+1}\rceil \, ,x \leq nf(x)=x+⌈x+1d⌉,x≤n
问题就转换为,判断 f(x)min≤nf(x)_{min} \leq nf(x)min≤n是否成立。
我们先忽略向上取整符号,只要最后 f(x)f(x)f(x) 的结果向上取整就可以了。
令u=x+1,u≤n+1u=x+1\, ,u \leq n + 1u=x+1,u≤n+1
于是,f(u)=u+du−1,u≤n+1f(u)=u+ \frac{d}{u} - 1\, ,u \leq n + 1f(u)=u+ud−1,u≤n+1
我们对f(u)f(u)f(u) 求导,得 f′(u)=1−du2f^{'}(u)=1- \frac{d}{u^{2}}f′(u)=1−u2d
令 f′(u)=0f^{'}(u)=0f′(u)=0,得 u=d,x=d+1u= \sqrt{d}\ ,x=\sqrt{d}+1u=d ,x=d+1
当u>du > \sqrt{d}u>d 时, f′(u)>0f^{'}(u)>0f′(u)>0, f′(u)f^{'}(u)f′(u)单调递增。
当u<du < \sqrt{d}u<d 时, f′(u)<0f^{'}(u)<0f′(u)<0, f′(u)f^{'}(u)f′(u)单调递减。
所以 x=d+1x=\sqrt{d}+1x=d+1 时,f(x)f(x)f(x)取得最小值, f(x)min=2d−1f(x)_{min}=2\sqrt{d}-1f(x)min=2d−1,只要判断 2d−1≤n2\sqrt{d}-1 \leq n2d−1≤n是否成立即可。
看似推导过程很长,但是只要是考过高考的人其实也就是两分钟的事情,还好我高中的东西还没有还给老师hhh。
题目代码
/*** Author: Veggie*/ #include <bits/stdc++.h> using namespace std; int T, s, d;//ceil是向上取整函数 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");elseprintf("NO\n");}return 0; }总结
以上是生活随笔为你收集整理的CF#1288A Deadline (函数求最值问题)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: ccf-csp #201903-4 消息
- 下一篇: ccf-csp #201912-1 报数