Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
Solution
Gọi `x` là số máy cần sản xuất `(x in NN^**)`
`=>` Tổng số ngày cần dùng để sản xuất `n` sản phầm là: `x+ |~n/x~|` ngày
Do `x` nguyên dương `=>` `x+|~n/x~|=|~x+n/x~|`
Bài toán bây giờ trở thành: Tìm min của hàm số `f(x)=x+n/x` với `x` nguyên dương và `n` là một tham số cho trước trên đoạn `[1;+oo)`
Ta xét: `f^'(x)=1-n/x^2=0` `<=>` `x=sqrtn`
Ta có bảng xét dấu `f^'(x)` như sau:
\begin{array}{|c|cc|} \hline x&1&&\sqrt{n}&&+\infty \\\hline f'(x)&&-&0&+ \\\hline \end{array}
`=>` `f(x)` nghịch biến trên `(1;sqrtn)`, đồng biến trên `(sqrtn;+oo)` và đạt cực tiểu tại `x=sqrtn`
Từ đây, ta dễ thấy:
`+` Nếu `n` là số CP thì kết quả là `f(sqrtn)`
`+` Nếu `n` không là số CP thì kết quả là `min{f(|__sqrt(n)__|),f(|~sqrt(n)~|)}`
AC Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool isPerfectSquare(ll n) {
ll s = sqrt(n);
return s * s == n;
}
ll f(ll x, ll n) {
return x + (n / x) + !(n % x == 0);
}
void solve(ll n) {
if (isPerfectSquare(n)) cout << f(sqrt(n), n);
else cout << min(f(sqrt(n), n), f(sqrt(n) + 1, n));
cout << '\n';
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t,n;
cin >> t;
while (t--) {
cin >> n;
solve(n);
}
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?
Sự kiện
39
727
9
quá ghê gớm:)