BUCTOJ2021年ACM竞赛班训练(四)问题 G: An interesting problem

题目描述:

给你n个数a[1], a[2], a[3], a[4]……a[n],需要你计算出在这里插入图片描述
的最小值,其中x为任意整数。


输入:

输入包含若干个测试样例。第一行只有一个数为测试样例的个数T(1<=T<=10)。
对于每一个测试样例,第一行有一个数为数组的元素个数n在这里插入图片描述,第二行有n个整数a[1], a[2], a[3]……a[n]在这里插入图片描述


输出:

其中只包含一行,为Sherry最少需要的双端队列数。


样例输入:

1
5
1 1 1 2 3


输出:

4


解题思路:

一道比较简单的题,直接拆开所求公式推导,
在这里插入图片描述
其中n,且n>0,a[i]^2的和,2*a[i]的和都为已知数,x是唯一未知数,故该题化简为开口向上的抛物线求对称轴处最小值,求对称轴的过程中可能取到小数,故用浮点数。
需要注意的是这道题的答案应取整数,故需要对对称轴的值进行四舍五入处理,找到较为接近对称轴的整数,并代入上面推导公式求得结果。


AC代码:

#include <iostream>

#include <stdio.h>

#include <queue>

#include <string.h>

#include <math.h>

#include <algorithm>

#include <stdlib.h>

#include <string>

#include <vector>

typedef long long ll;

typedef double db;

#include <list>

#include <stack>

#include <cstring>

#include <cmath>

using namespace std;

const int N =2010;

char dadi,str[1000],str2[1000];

int main()

{

    ll n,t,a[100005],ans,sum,i,cuna,j,man,k;

    db cun;

    scanf("%lld",&t);

    while(t--)

    {

        scanf("%lld",&n);

        sum=0;

        man=0;

        for(i=0;i<n;i++)

        {

            scanf("%lld",&a[i]);

            sum+=a[i];

            man+=a[i]*a[i];

        }

        cun=sum*1.0/n;

        cuna=cun;

        if(cuna!=cun)

        {

            if(cuna<cun)

            {

                if(cun-cuna>=0.5)

                {

                    cuna++;

                }

            }

            else if(cuna>cun)

            {

                if(cuna-cun>=0.5)

                {

                    cuna--;

                }

            }

        }

        ans=n*cuna*cuna-2*sum*cuna+man;

        printf("%lld\n",ans);

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值