zoukankan      html  css  js  c++  java
  • 牛客网——E求最值

    链接:https://www.nowcoder.com/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<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    using ll = long long;
    const int qq = 100005;
    ll a[qq];
    
    
    inline ll sqr(ll x){ return x*x;}
    
    int main()
    {
        int n;
        cin >> n;
        for(int i=1;i <= n;i++)
        {
            scanf("%lld",a + i);
            a[i] += a[i-1];
        }
    
    
        ll minans = INF;
        for(int i=1;i <= n;i++)
        {
            int k=1;
            for(int j=i-1;j >= 1&&k<=10;j--,k++)
            {
                ll ans = sqr(i-j) + sqr(a[i]-a[j]);
                if(ans < minans)
                    minans = ans;
            }
        }
        cout << minans << endl;
        return 0;
    }

    1.第一处是计算从L到R区间的和用 (a[R] - a[L]) 其中 a[ i ] 是从开头加到第 i 个位置,在多组数据的时候可以避免重复计算。

    2.第二个就是因为求得是最小值所以 (i - j)一定不会很大

    3.牛客网可以看别人代码,蛮好的,要多学习一点大神们的代码方式。

  • 相关阅读:
    Android
    Android
    Android
    JAVA动态代理基础
    TCP连接与OKHTTP复用连接池
    Android
    Android
    GitHub上README.md教程
    android
    HDU 1097 A hard puzzle
  • 原文地址:https://www.cnblogs.com/cunyusup/p/8392865.html
Copyright © 2011-2022 走看看