链接:https://www.nowcoder.net/acm/contest/59/E
来源:牛客网
给你一个长为n的序列a
定义f(i,j)=(i-j)2+g(i,j)2
g是这样的一个函数
求最小的f(i,j)的值,i!=j
输入描述:
第一行一个数n 之后一行n个数表示序列a
输出描述:
输出一行一个数表示答案
示例1
输入
4 1 0 0 -1
输出
1
备注:
对于100%的数据,2 <= n <= 100000 , |ai| <= 10000
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #define LL long long using namespace std; using namespace std; const int N=100005; int num[N]; long long int sum[N]; long long int res; int main() { int n; while(cin>>n) { sum[0]=0; for(int i=1;i<=n;i++) { cin>>num[i]; sum[i]=sum[i-1]+num[i]; } res=2*0x3f3f3f3f; for(int i=1;i<=n;i++) { for(int j=i+1;j<=i+1100&&j<=n;j++) { long long int ans=(i-j)*(i-j)+(sum[j]-sum[i])*(sum[j]-sum[i]); res=min(ans,res); } } cout<<res<<endl; } return 0; }
未来的我一定会感谢正在努力的现在的我!
本文介绍了一道来自牛客网的ACM竞赛题目,该题要求找出一个长度为n的序列中,使得函数f(i,j)取到最小值的一对i和j,其中i不等于j。提供了一个C++实现的解决方案,通过预处理和滑动窗口技术来减少计算复杂度。
790

被折叠的 条评论
为什么被折叠?



