CF#1288A Deadline (函数求最值问题)

问题描述

#1288A

题目大意

输入 n n d d , 能否找到 x x 使得 x + d x + 1 n , ( x n ) x+ \lceil \frac{d}{x+1} \rceil \leq n \, ,(x \leq n)
如果可以就输出"YES",否则输出"NO"。

题目解析

这是一道有意思的题目,用上了高中的函数最值问题的求解。

f ( x ) = x + d x + 1 , x n f(x)=x+ \lceil \frac{d}{x+1}\rceil \, ,x \leq n

问题就转换为,判断 f ( x ) m i n n f(x)_{min} \leq n 是否成立。

我们先忽略向上取整符号,只要最后 f ( x ) f(x) 的结果向上取整就可以了。

u = x + 1 , u n + 1 u=x+1\, ,u \leq n + 1

于是, f ( u ) = u + d u 1 , u n + 1 f(u)=u+ \frac{d}{u} - 1\, ,u \leq n + 1

我们对 f ( u ) f(u) 求导,得 f ( u ) = 1 d u 2 f^{'}(u)=1- \frac{d}{u^{2}}

f ( u ) = 0 f^{'}(u)=0 ,得 u = d   , x = d + 1 u= \sqrt{d}\ ,x=\sqrt{d}+1

u > d u > \sqrt{d} 时, f ( u ) > 0 f^{'}(u)>0 , f ( u ) f^{'}(u) 单调递增。
u < d u < \sqrt{d} 时, f ( u ) < 0 f^{'}(u)<0 , f ( u ) f^{'}(u) 单调递减。

所以 x = d + 1 x=\sqrt{d}+1 时, f ( x ) f(x) 取得最小值, f ( x ) m i n = 2 d 1 f(x)_{min}=2\sqrt{d}-1 ,只要判断 2 d 1 n 2\sqrt{d}-1 \leq 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");
        else
            printf("NO\n");
    }
    return 0;
}
发布了59 篇原创文章 · 获赞 103 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42292229/article/details/104012172