2017.7.31 征途 失败总结
2017-07-31 22:35
155 查看
、这题其实是一步分析错了,所以一直wa
首先要求方差,就是要求 Σ(ai-V平均)^2 当然还要除以m (第一遍忘了除,第二遍除的是n、、)
平均数就是总和再除以m
这可能不能用小数 示完,所以就考虑拆成分数,这样算到最后一步分母是m^3(一个平方+数的个数)
因为要输出v*m^2所以直接分子/m就好了
然后转移是 f【i】【j】=min(f【i-1】【k】+(qsum【j】-qsum【k】-v平均)^2)
拆开就可以写出直线方程:
2*qsum【j】*qsum【k】*m*m+f【j】+2*qsum【j】*m*qsum【n】-m*m=f【k】+q【k】*q【k】*qsum【n】*qsum【n】+2*qsum【k】*m*qsum【n】;
然后在n*m的做就行了 设v1=qsum【n】 v2=m; 纯粹为了方便
要注意枚举的时候从上一层转移,所以移动l++用当前层(用现在的状态调整状态的选取) r--要用上一层(加入一个选择,并维护状态的凸包形态)
另外枚举的时候尽量避免枚举k,而加减却要用k-1的情况(自找麻烦,而且容易遗漏)
对于有一天没走路的情况,可以通过递推避免,如果f【1】【0】==inf 拿后来的f【2】【1】也将由f【1】【0】转移来,==inf 所以细节需要处理,保证每一天都走
码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,a[3005],qsum[3005],v1,v2,f[3005][3005],l,r,q[3005];
double xl(int ceng,long long a,long long b)
{
return (double(f[ceng][b]-f[ceng][a]+qsum[b]*qsum[b]*v2*v2-qsum[a]*qsum[a]*v2*v2+2*(qsum[b]-qsum[a])*v1*v2)/double(qsum[b]-qsum[a]));
}
int main()
{
memset(f,0x6f,sizeof(f));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),v1+=a[i],qsum[i]=qsum[i-1]+a[i];
v2=m;
f[0][0]=0;
for(int i=1;i<=n;i++)
f[1][i]=(qsum[i]*v2-v1)*(qsum[i]*v2-v1);
for(int i=2;i<=m;i++)
{
l=1;
r=1;
q[1]=0;
for(int j=1;j<=n;j++)
{ while(l<r&&(xl(i-1,q[l],q[l+1])<=(2*qsum[j]*v2*v2)))l++;
int k=q[l];
f[i][j]=f[i-1][k]+(qsum[j]*v2-qsum[k]*v2-v1)*(qsum[j]*v2-qsum[k]*v2-v1);
while(l<r&&(xl(i-1,q[r-1],q[r])>xl(i-1,q[r],j)))r--;
q[++r]=j;
}
}
printf("%lld",f[m]
/m);
}
首先要求方差,就是要求 Σ(ai-V平均)^2 当然还要除以m (第一遍忘了除,第二遍除的是n、、)
平均数就是总和再除以m
这可能不能用小数 示完,所以就考虑拆成分数,这样算到最后一步分母是m^3(一个平方+数的个数)
因为要输出v*m^2所以直接分子/m就好了
然后转移是 f【i】【j】=min(f【i-1】【k】+(qsum【j】-qsum【k】-v平均)^2)
拆开就可以写出直线方程:
2*qsum【j】*qsum【k】*m*m+f【j】+2*qsum【j】*m*qsum【n】-m*m=f【k】+q【k】*q【k】*qsum【n】*qsum【n】+2*qsum【k】*m*qsum【n】;
然后在n*m的做就行了 设v1=qsum【n】 v2=m; 纯粹为了方便
要注意枚举的时候从上一层转移,所以移动l++用当前层(用现在的状态调整状态的选取) r--要用上一层(加入一个选择,并维护状态的凸包形态)
另外枚举的时候尽量避免枚举k,而加减却要用k-1的情况(自找麻烦,而且容易遗漏)
对于有一天没走路的情况,可以通过递推避免,如果f【1】【0】==inf 拿后来的f【2】【1】也将由f【1】【0】转移来,==inf 所以细节需要处理,保证每一天都走
码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,a[3005],qsum[3005],v1,v2,f[3005][3005],l,r,q[3005];
double xl(int ceng,long long a,long long b)
{
return (double(f[ceng][b]-f[ceng][a]+qsum[b]*qsum[b]*v2*v2-qsum[a]*qsum[a]*v2*v2+2*(qsum[b]-qsum[a])*v1*v2)/double(qsum[b]-qsum[a]));
}
int main()
{
memset(f,0x6f,sizeof(f));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),v1+=a[i],qsum[i]=qsum[i-1]+a[i];
v2=m;
f[0][0]=0;
for(int i=1;i<=n;i++)
f[1][i]=(qsum[i]*v2-v1)*(qsum[i]*v2-v1);
for(int i=2;i<=m;i++)
{
l=1;
r=1;
q[1]=0;
for(int j=1;j<=n;j++)
{ while(l<r&&(xl(i-1,q[l],q[l+1])<=(2*qsum[j]*v2*v2)))l++;
int k=q[l];
f[i][j]=f[i-1][k]+(qsum[j]*v2-qsum[k]*v2-v1)*(qsum[j]*v2-qsum[k]*v2-v1);
while(l<r&&(xl(i-1,q[r-1],q[r])>xl(i-1,q[r],j)))r--;
q[++r]=j;
}
}
printf("%lld",f[m]
/m);
}
相关文章推荐
- 创业失败的10个教训总结
- 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(十五)——JSP基础语法 任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语
- 失败一时并不可怕,可怕的是不去总结和改正。
- android.cts.jank.ui.CtsDeviceJankUi--testScrolling失败原因总结和debug方法介绍
- iphone 游戏开发 失败经验 总结
- 程序员职场工作七年的失败之路总结
- 从银行转账失败到分布式事务:总结与思考
- Navicat建立外键失败原因总结
- 工作总结12 ADMU7704E: 在尝试启动与服务器相关联的 Windows 服务时失败:server1
- win7 64 arduino driver 安装失败的总结
- 我的2014年总结 - 一些失败的面试经历
- Visual studio 2013安装失败总结
- thoughtworks面试失败总结
- 2个创业项目失败总结
- Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 部署错误: 启动 Tomcat 失败。-- '127.0.0.1' 不是内部或外部命令,也不是可运行的程序
- linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,来日再战!)
- 2017.10.8 志愿者招募 失败总结
- 2017.10.9 DZY Loves Math VI 失败总结
- 自制DSP5509A核心板硬件调试—连接仿真器失败原因总结
- 2017.9.9 幸运数字 失败总结