BZOJ3095 : 二元组

\[\begin{eqnarray*}
&&\sum_{i=0}^{n-1}\left(ki+b-a_i\right)^2\\
&=&\sum_{i=0}^{n-1}\left(k^2i^2+b^2+a_i^2+2kbi-2kia_i-2ba_i\right)\\
&=&k^2\sum_{i=0}^{n-1}i^2+nb^2+\sum_{i=0}^{n-1}a_i^2+2kb\sum_{i=0}^{n-1}i-2k\sum_{i=0}^{n-1}ia_i-2b\sum_{i=0}^{n-1}a_i\\
\end{eqnarray*}\]

  设
\[\begin{eqnarray*}
A&=&\sum_{i=0}^{n-1}i^2\\
B&=&\sum_{i=0}^{n-1}i\\
C&=&\sum_{i=0}^{n-1}ia_i\\
D&=&\sum_{i=0}^{n-1}a_i\\
\end{eqnarray*}\]
  则只需最小化
\[\begin{eqnarray*}
&&Ak^2+nb^2+2kBb-2kC-2Db\\
&=&nb^2+(2kB-2D)b+Ak^2-2kC\\
\end{eqnarray*}\]
  这是个关于$b$的二次函数,显然当$b$取$\frac{D-kB}{n}$时取得最小值,将$b$用$k$表示,则
\[\begin{eqnarray*}
&&Ak^2+nb^2+2kBb-2kC-2Db\\
&=&Ak^2+\frac{\left(D-kB\right)^2}{n}+\frac{2kB\left(D-kB\right)}{n}-2kC-\frac{2D\left(D-kB\right)}{n}\\
&=&Ak^2+\frac{-D^2-B^2k^2+2BDk}{n}-2Ck\\
&=&\frac{nAk^2-2nCk-D^2-B^2k^2+2BDk}{n}\\
&=&\frac{\left(nA-B^2\right)k^2+\left(2BD-2nC\right)k-D^2}{n}\\
\end{eqnarray*}\]
  这也是个关于$k$的二次函数,显然当$k$取$\frac{nC-BD}{nA-B^2}$时取得最小值。直接计算即可,时间复杂度$O(n)$。

#include<cstdio>
int n,i,j;double A,B,C,D,k,b;
inline void read(int&a){
  char c;bool f=0;a=0;
  while(!((((c=getchar())>=‘0‘)&&(c<=‘9‘))||(c==‘-‘)));
  if(c!=‘-‘)a=c-‘0‘;else f=1;
  while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;
  if(f)a=-a;
}
int main(){
  for(read(n);i<n;i++)read(j),A+=1.0*i*i,B+=i,C+=1.0*i*j,D+=j;
  k=(C*n-B*D)/(A*n-B*B),b=(D-k*B)/n;
  return printf("%.7f %.7f",b,k),0;
}

  

时间: 2024-08-06 11:43:25

BZOJ3095 : 二元组的相关文章

主客体二元组是个十分靠近世界的本质的数据结构

我最近有个感悟,就是有方向的二元组.通过对一个有方向的主客体二元组记录集合的解释可以表现出任意的树结构图结构. 这个二元组是常驻内存的,随时变更随时生效,xml或db纯粹用来持久化数据.这个二元组是中心,其它都是附属. 挺巧合的,Dictionary<key,value>这种对象刚好是个有方向的二元组集合. jint这个javascript引擎就是用Dictionary<key,value>来解释javascript的的 而且事实证明效率不是低而是更高,人家根本就没低效啊,事实是是

数据逻辑结构 的 二元组表示法

转自:https://blog.csdn.net/qq_35733751/article/details/80444757 对于数据的逻辑结构还有一种二元组表示法,下面是二元组表示方法. 逻辑结构二元组表示方法:B = (D , R)B——数据结构D——数据元素的集合R——D上二元关系的集合   在上面这种二元组表示方法中,B就是一种数据结构, 用上面的二元组来表示B这种数据结构时,就是由数据元素的集合D和D中的二元关系的集合R组成的,通过这句话,我们可以明白:D=di|1≤i≤n,n≥0, 数

升序数据中找到二元组为固定之和

1:题目描述 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 示例 1: 输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2: 输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10] 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-

Swift(二,元组,可选类型,类型转化)

一,首先,元组是Swift中特有的,OC中没有元组相关类型,具体怎么用,看下面的例子吧 //1.使用元组来定义一组数据 let infoTuple = ("cjh",18,1.8) let nameTuple = infoTuple.0 print(nameTuple) let count = nameTuple.characters.count //2.1 普通元组的定义方式 let errorMsg = ("error",123) errorMsg.0 //2.

Java中元组的使用

元组在计算机领域有着特殊的意义,这个名字听起来似乎有些陌生, 平时在写代码也基本没什么应用场景, 然而, 出人意料的是, 元组跟程序设计密切相关, 可能有的同学不知道, 关系数据库中的「纪录」的另一个学术性的名称就是「元组」, 一条记录就是一个元组, 一个表就是一个关系, 纪录组成表, 元组生成关系, 这就是关系数据库的核心理念. 元组是关系数据库不可脱离的部份, 但是在程序设计中, 元组并不显得那么不可或缺. 有一些编程语言本身就自带元组的语法, 比如说python.F#.haskell.sc

Day5-python基础之函数(二)

生成器 迭代器 装饰器 模块 来个需求,一个列表中所有元素都+1 1.最容易想到的方法 for循环,找列表索引,对应每个值+1 list_old = [1,2,3,4,5,6,7,8,9] for index,i in enumerate(list_old): list_old[index]+=1 print(list_old) 2.用上节课讲的匿名函数试试,也可以 a = map(lambda x:x+1,list_old) for i in a: print(i) 3.列表生成 a = [i

06_模块(二)_正则

1 sys 进度条实例 import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100) r = '\r%d%%' % (rate_num, ) # \r从起始位置重新开始 sys.stdout.write(r) # 不换行输出 sys.stdout.flush() # 清空输出内容 if __name__ == '__main__': for

Python模块详解(二)

这一部分主要介绍sys.os.hashlib和re模块. 一.sys模块 sys模块涉及的主要是与python解释器相关的操作.这里的system应当理解为python的系统,而不是主机的系统.os模块才是主机操作系统相关.在sys模块中,毫无疑问,最重要的是sys.path,它决定了你的模块搜索路径,任何一个python程序员都必须搞清楚它的所有问题. sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.versi

python学习笔记-Day05-第二部分(模块简介)

模块是一种组织形式,他是 实现了某个功能的代码的集合,它将彼此有关系的代码组织到一个文件或一个目录中(目录中包含多个文件,这里改称为 "包"). 模块分三类 内置模块 第三方模块 自定义模块 模块的定义: package/└── mod01.py package/├── mod01.py├── mod02.py└── mod03.py package/├── __init__.py├── mod01.py├── mod02.py└── mod03.py package/├── __in