常州day1p5
给一个 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的更多相关文章
- [日常训练]常州集训day8
T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...
- [日常训练]常州集训day7
T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...
- [日常训练]常州集训day5
T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...
- [日常训练]常州集训day3
T1 Description 有$K$个石子,石子只能放在$N$条水平线与$M$条竖直线构成的网格的交点上. 求用$K$个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. ...
- [日常训练]常州集训day2
T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...
- 常州Day4题解
1. 高精度 这题略水,字符串可过,还不加压位等,操作只有BitShift和add/sub,不过编程复杂度有些高.(输出都是二进制我能说些什么...) 2. N皇后问题 (警告! 不是平时你见到的N皇 ...
- 常州培训 day5 解题报告
第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...
- 常州培训 day7 解题报告
最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元 n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...
- 常州培训 day6 解题报告
第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1, ...
随机推荐
- jsp命名规则
jsp也用驼峰规则命名即可,不要使用下划线,否则在tomcat中容易出现解析错误
- Spring学习(六)-----Spring使用@Autowired注解自动装配
Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...
- 一个web应用的诞生(2)--使用模板
经过了第一章的内容,已经可以做出一些简单的页面,首先用这种方式做一个登录页面,首先要创建一个login的路由方法: @app.route("/login",methods=[&qu ...
- appium -- 页面出现弹窗,关闭后,无法识别页面元素(转)
原文:https://www.cnblogs.com/leavescy/p/9733001.html; 1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发 ...
- eclipse查看源代码问题
最近分析源代码时,eclipse总是出错,显示org.eclipse.core.runtime.CoreException,解决方法:在builderpath点击 add external jars, ...
- 使用IntelRealScene设备结合Cocos引擎实现体感游戏开发
英特尔开发人员专区原文地址 Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的 ...
- IDEA 创建Spring Boot 项目
一.准备环境 配置Maven,打开设置页面File - Setting,快捷键Ctrl + Alt + S,找到Maven,默认是IDEA 自带的插件,User setting file 配置文件默认 ...
- CS231n assignment2
preparation: solve the problem of `from builtins import rang` pip install future update_rule
- hibernate.hbm.xml文件配置入门小结(1)
在Hibernate中,各表的映射文件xxx.hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具. hibernate.hbm.xml文件的基本结构如下 ...
- mysql查看锁表与解锁
查看锁表语句 show OPEN TABLES where In_use > 0; 找到锁表的进程 show processlist; 删除锁表进程 kill 51045123;