2022年牛客多校第2场 J . Link with Arithmetic Progression (三分+枚举)

简介: 2022年牛客多校第2场 J . Link with Arithmetic Progression (三分+枚举)

题意

给一个序列,对于其中的元素可以改变为任意值,花费为差值的平方,问将其改编为等差序列的最小花费

思路

假设之前的序列为a1,a2,a3……

修改后的序列为b1,b2,b3……

首项为b1,公差为d

差值ci=ai-bi

bi=b1+(i-1)d

答案就是c1c1+c2c2+……=

(a1-(b1+(i-1)d))^2+ (a2-(b1+(i-1)d))^2+……

然后化简出来发现把公差d当作未知数得到二元一次函数

三分d来缩小范围 check的时候计算代价

知道d以后

ci=ai-bi=ai-(b1+(i-1)d)

ci+b1都是未知的,放到一侧

ci+b1=ai-(i-1)d=di

c1c1+c2c2+c3c3+……

=(d1-b1)^2+ (d2-b1)^ 2+(d3-b1)^2+……

=nb1b1-2(d1+d2+d3+……)b1+(d1 * d1+d2 * d2+d3 * d3+……)

b1是未知数

相当于ax^2+by+c求极值,当x=-b/2a时取得极值

b1=(-2(d1+d2+d3+……))/(-2n)=(d1+d2+d3+……)/n

然后在计算ci就行了

ci=di-b1

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
long double a[maxn];
long double b[maxn];
long double eps=1e-10;
int n;
long double check(long double d){
  long double res=0,sum=0;
  for(int i=1;i<=n;i++){
    b[i]=(a[i]-(i-1)*d);
    sum=sum+b[i];
  }
  sum/=n;
  for(int i=1;i<=n;i++){
    res=res+(b[i]-sum)*(b[i]-sum);
  }
  return res;
}
int main() {
  int _;scanf("%d",&_);
  while(_--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%Lf",&a[i]); 
    long double l=-1e10,r=1e10;
    while(r-l>eps){
      long double mid1=l+(r-l)/3.0,mid2=r-(r-l)/3.0;
      if(check(mid1)>check(mid2)) l=mid1;
      else r=mid2;
      //cout<<_<<" "<<l<<" "<<r<<endl;
    }
    printf("%.10Lf\n",check(l));
  }
  return 0;
}


目录
相关文章
|
8月前
|
算法
Plant(快速幂+数学分析(没想到吧,数学无处不在))
Plant(快速幂+数学分析(没想到吧,数学无处不在))
29 0
|
9月前
2022天梯赛三月冲刺——PAT (Advanced Level)1013 Battle Over Cities (并查集找连通块)
2022天梯赛三月冲刺——PAT (Advanced Level)1013 Battle Over Cities (并查集找连通块)
51 0
|
11月前
|
C语言 C++
PTA团体程序设计天梯赛-练习集: L1-050 倒数第N个字符串 ( 15分 )
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。 输入格式: 输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤105)。 输出格式: 在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。 输入样例:
128 0
|
机器学习/深度学习 人工智能
PTA 7-3 拼题 A 是真爱 (20 分)
如果一个人在一段话里很多次提到 pintia,那对拼题 A 就是真爱啦~ 本题就请你检查一下给定的文字中出现了几次 pintia。
99 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:4.分配口罩
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:4.分配口罩
115 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:2.纪念日
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:2.纪念日
94 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:2.纪念日
【CCCC】L2-029 特立独行的幸福 (25分),模拟题,set用法
【CCCC】L2-029 特立独行的幸福 (25分),模拟题,set用法
136 0
|
存储 算法 调度
【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
355 0
|
安全
【2021团体程序设计天梯赛】L2部分(PTA,L2-037到L2-040)题解代码
【2021团体程序设计天梯赛】L2部分(PTA,L2-037到L2-040)题解代码
253 0
|
机器人 C语言
【2021团体程序设计天梯赛】L1部分(PTA,L1-073到L1-080)题解代码
【2021团体程序设计天梯赛】L1部分(PTA,L1-073到L1-080)题解代码
278 0