给一个 n∗m 的矩阵,矩阵的每个格子上有一个不超过 30 的非负整数。 我们定义一条合法的路线是从(1,1)开始只能向右和向下移动到达(n,m)的路线。 定义数列 A1,A2,A3,..,An+m−1 为一条合法路线上的序列,且 Aavg 为该数列的平均值。该路线的 价值为 (n + m−1) 乘上该数列的方差。 即价值的表达式为 (n + m−1)∑n+m−1 i=1 (Ai−Aavg)2。 请找一条价值最小的路线,并输出这个价值。

对于 100% 的数据,n,m,ai,j ≤ 30

我们发现对于一条确定的路径sigma((a[i]-s)^2)是一个关于s的二次函数,而方差是二次函数的最低点

在数据大的时候会有很多的二次函数,这些二次函数最低点的最小的那个就是答案

这些二次函数的最小值大概会形成一个类似单谷函数的东西。

于是三分。

这是错误的,但是很难卡掉。

小数据暴力

时间复杂度 O(n^2logn)

实际上是标程一个牺牲一定准确性的优化

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<set>
#include<map>
#include<vector>
#define il inline
#define re register
using namespace std;
typedef double db;
int n,m,a[][],dir[],b[];
db val[][],f[][];
il db sqr(db x){return x*x;}
il void small(){
db final=1e50;
for(int S=(<<(n+m-))-;S>=;--S){
for(int i=;i<n+m-;i++) dir[i]=((S&(<<i))>);
int u=,v=,flag=true;
db ans,cnt=a[][];
for(int i=;i<n+m-;i++){
if(dir[i]) u++;
else v++;
if(!(<=u&&u<=n&&<=v&&v<=m)){
flag=false;break;
}
b[i]=a[u][v];cnt+=b[i];
}
if(!flag) continue;
cnt=cnt/(n+m-);ans=sqr(cnt-a[][]);
for(int i=;i<n+m-;i++){
ans+=sqr(cnt-b[i]);
}
final=min(final,ans*(n+m-));
}
printf("%.0lf",final);
}
il db res(db ave){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
val[i][j]=sqr(ave-a[i][j]);
f[][]=val[][];
for(int i=;i<=m;i++) f[][i]=f[][i-]+val[][i];
for(int i=;i<=n;i++) f[i][]=f[i-][]+val[i][];
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
f[i][j]=min(f[i-][j],f[i][j-])+val[i][j];
}
return f[n][m]*(n+m-);
}
int main(){
freopen("route.in","r",stdin);
freopen("route.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]);
if(n+m<=){
small();exit();
}
db l=,r=,m1,m2;
for(int i=;i<=;i++){
m1=(r-l)/+l;
m2=r-(r-l)/;
// cout<<l<<" "<<m1<<" "<<m2<<" "<<r<<endl;
if(res(m1)<res(m2)) r=m2;
else l=m1;
}
printf("%.0lf",res((l+r)/));
return ;
}

常州day1p5的更多相关文章

  1. [日常训练]常州集训day8

    T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...

  2. [日常训练]常州集训day7

    T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...

  3. [日常训练]常州集训day5

    T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...

  4. [日常训练]常州集训day3

    T1 Description 有$K$个石子,石子只能放在$N$条水平线与$M$条竖直线构成的网格的交点上. 求用$K$个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. ...

  5. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  6. 常州Day4题解

    1. 高精度 这题略水,字符串可过,还不加压位等,操作只有BitShift和add/sub,不过编程复杂度有些高.(输出都是二进制我能说些什么...) 2. N皇后问题 (警告! 不是平时你见到的N皇 ...

  7. 常州培训 day5 解题报告

    第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...

  8. 常州培训 day7 解题报告

    最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元  n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...

  9. 常州培训 day6 解题报告

    第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1, ...

随机推荐

  1. bootstrap form样式及数据提交

    1.基本form布局 想要把form表单弄成两列的表格样式,奈何前端不太懂,记录下样式便于下次使用. form-group :增加盒子的下边界 form-control: 充满整个父元素,并且有换行作 ...

  2. Qt-QML-电子罗盘

    使用QML中的Canvas实现电子罗盘绘制,效果图如下 一个简单的电子罗盘,红色N极.其中中间飞机表示当前的指向, 还是比较简单的,直接上代码吧 /* 作者:张建伟 时间:2018年4月27日 简述: ...

  3. appium+python自动化☞环境搭建

    前言:appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.略懂Python,所以接下来的教程是 appium+pyt ...

  4. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  5. Numpy入门笔记第二天

    # 数组的组合 import numpy as np arr1 = np.arange(5) arr2 = np.arange(3) print arr1 print arr2 [0 1 2 3 4] ...

  6. BVT、EVT、DVT、PVT产品开发几个阶段

      EVT EVT(Engineering Verification Test) 工程验证 产品开发初期的设计验证.设计者实现样品时做初期的测试验证,包括 功能和安规测试,一般由 RD(Researc ...

  7. GCD最大公约数

    说明: 最初跟鹏哥学习最大公约数的算法是辗转相除,确实印象很深刻,那种辗转赋值的思想在好多题目中都有运用,但随着进一步学习,我也参考了其他几种方便快捷的最大公约数求法,在这里做一个总结. . int ...

  8. 寻找bug

    bug1:void不应有返回值. bug2:while(n--)没有条件终止循环. bug3:size和data没有定义 bug4:arr 是sz 在大于0的情况下创建的 一定部位bull   下面的 ...

  9. RIGHT-BICEP测试第二次程序

    根据Right-BICEP单元测试的方法我对我写的第二次程序进行了测试: 测试一:测试能否控制使用乘除 测试二:测试是否能加括号 测试三:是否可以控制题目输出数量 测试四:能否控制输出方式,选择文件输 ...

  10. Codeforces Beta Round #6 (Div. 2 Only) 单调队列

    题目链接: http://codeforces.com/contest/6/problem/E E. Exposition time limit per test 1.5 secondsmemory ...