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;
}


目录
相关文章
|
6月前
|
存储 算法
【随想】每日两题Day.20(实则一题)
【随想】每日两题Day.20(实则一题)
35 0
|
6月前
|
存储
【随想】每日两题Day.10(实则一题)
【随想】每日两题Day.10(实则一题)
33 0
|
C++ 网络架构
【PAT甲级 - C++题解】1013 Battle Over Cities
【PAT甲级 - C++题解】1013 Battle Over Cities
62 1
|
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 个字符串。题目保证这个字符串是存在的。 输入样例:
170 0
(数学)(必要解题步骤)2021icpc上海D. Strange Fractions
(数学)(必要解题步骤)2021icpc上海D. Strange Fractions
78 0
|
缓存 Java 测试技术
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:7.外卖店优先级
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:7.外卖店优先级
142 0
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:7.外卖店优先级
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:2.纪念日
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:2.纪念日
137 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:2.纪念日
|
测试技术 Windows
第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)-2
第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)
143 0
第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)-2
第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)-1
第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)
184 0
第十二届蓝桥杯决赛JavaC组真题——详细答案对照(全网唯一:异或变换100%数据)-1
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:4.分配口罩
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:4.分配口罩
143 0