探索的时光 (整数三分)
原创 于 2024-04-29 14:53:05 发布 · 粉丝可见 · 487 阅读 · 8 · 1 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/138312829
本题链接: 登录—专业IT笔试面试备考平台_牛客网
题目:

样例:
cobol<br/>5<br/>3 2 1 2 3<br/> |

思路:
根据题意,已经给出了运算函数 $$
f(x) = {(x - i)}^{2} * a[i]
$$当我们看到这些函数的时候,联想一下,它们的单调性,以及性质。这是一个抛物线,题目要求我们寻找最小值,说明就是要我们寻找极小值,寻找极值,我们使用三分。
代码详解如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <iostream> #include <vector> #define endl '\n' #define int long long #define YES puts("YES") #define NO puts("NO") #define INF 0x3f3f3f3f3f3f #define umap unordered_map #define All(x) x.begin(),x.end()
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0) using namespace std; const int N = 2e6 + 10; inline void solve();
signed main() {
int _t = 1; while (_t--) { solve(); } return 0; } int n,a[N];
inline int f(int x) { int res = 0; for(int i = 1;i <= n;++i) { int t = (i - x) * (i - x); res += (t * a[i]); } return res; } inline void solve() { cin >> n; for(int i = 1;i <= n;++i) cin >> a[i]; int l = 1,r = n; while(l < r) { int midl = l + (r - l) / 3; int midr = r - (r - l) / 3; if(f(midl) <= f(midr)) r = midr - 1; else l = midl + 1; } int ans = min(f(l),f(r)); cout << ans << endl; }
|
最后提交:
