测绘

题目大意

为了研究农场的气候, \(Betsy\) 帮助农夫 \(John\) 做了 \(N(1 <= N <= 100)\) 次气压测量并按顺序记录了结果 \(M_1...M_N(1 <= M_i <= 1,000,000)\) , \(Betsy\) 想找出一部分测量结果来总结整天的气压分布. 她想用 \(K(1 <= K <= N)\) 个数 \(s_j(1 <= s_1 < s_2 < ... < s_K <= N)\) 来概括所有测量结果. 她想限制如下的误差:

 对于任何测量结果子集,每一个非此子集中的结果都会产生误差.总误差是所有测量结果的误差之和.更明确第说, 对于每一个和所有 \(s_j\) 都不同的 \(i\) :

  * 如果 \(i\) 小于 \(s_1\), 误差是: \(2 * | M_i - M_(s_1) |\)

  * 如果 \(i\) 在 \(s_j\) 和 \(s_(j+1)\) 之间,误差是: \(| 2 * M_i - Sum(s_j, s_(j+1)) |\)

  注: \(Sum(x, y) = M_x + M_y\) ; ( \(M_x\) 和 \(M_y\) 之和)

  * 如果 \(i\) 大于 \(s_K\) ,误差为: \(2 * | M_i - M_(s_K) |\)

  \(Besty\) 给了最大允许的误差 \(E (1 <= E <= 1,000,000)\) ,找出最小的一部分结果使得误

差最多为 \(E\).

Input

  第一行: 两个空格分离的数: \(N\) 和 \(E\)

  第 \(2..N+1\) 行: 第 \(i+1\) 行包含一次测量记录: \(M_i\)

Output

  第一行: 两个空格分开的数: 最少能达到误差小于等于 \(E\) 的测量数目和使用那个测量数目能达到的最小误差.

样例

输入

4 20
10
3
20
40

输出

2 17

思路

首先我们要理解一点就是这道题是数量优先,能选最少的就选最少的,在数量最少的情况下再算误差的最小,理解了这个再往下看,我一开始并没有想到是个 \(dp\) 的题目,专心研究怎么暴力(啊这),但是后来仔细一想,这真的就是一个赤裸裸的线性 \(dp\),首先我们定义dp数组的含义, \(dp[i][j]\)表示的含义就是在前j个数里选i个测试点的最小误差,那么再思考一个问题,\(dp[i][j]\) 这个状态一定选了第 \(j\) 个节点作为测试点了(你品,你细品),否则这道题的转移方程就很难写...,转移方程还要注意一个方面,不能只算前j个数的误差,一定是把j之后的误差都要算上,在这里就不举例子了,转移方程:\(dp[i][j]=min(dp[i][j],dp[i-1][k]-p[k][N+1]+p[k][j]+p[j][N+1]\),其中p数组是已经预处理好之后的状态,讲到这里就没什么好说的了,首先先初始化,然后 \(dp\) 处理,具体看代码。

代码实现

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
long long N,E;
long long ans,dp[120][120],p[120][120];
long long a[120];
void Read_pri(){//初始化+输入数据(没写快读)
scanf("%lld%lld", &N, &E);
for(int i = 1; i <= N; i++){
scanf("%lld",&a[i]);
}
for(int i = 1; i <= N; i++){
for(int j = i + 1; j <= N; j++){
for(int k = i + 1; k < j; k++){
p[i][j] += abs(2 * a[k] - a[i] - a[j]);
}
}
for(int j = 1; j < i; j++){
p[i][0] += 2*abs(a[i]-a[j]);
}
for(int j = i + 1; j <= N; j++){
p[i][N+1] += 2*abs(a[j] - a[i]);
}
}
} int main(){
Read_pri();
int id = N;
ans = INF;
for(int i = 1; i <= N; i++){//特判一下一个测试点是否可以满足条件
dp[1][i] = p[i][0] + p[i][N+1];
if(dp[1][i] <= E){
id = 1;
ans = min(ans, dp[1][i]);
}
}
if(id == 1){
printf("%d %lld",id, ans);
return 0;
}
for(int i = 2; i <= N; i++){
for(int j = i; j <= N; j++){
dp[i][j] = INF;
for(int k = i - 1;k < j; k++){
dp[i][j] = min(dp[i][j],dp[i - 1][k] - p[k][N + 1] + p[k][j] + p[j][N+1]);
}
if(dp[i][j] <= E){
if(i > id) continue;
else if(i < id){
id = i;
ans = dp[i][j];
}else{
ans = min(ans, dp[i][j]);
}
}
}
}
printf("%d %lld",id, ans);
return 0;
}

谢谢阅读

JZOJ2018提高组-测绘的更多相关文章

  1. tyvj4541 zhx 提高组P1

    背景 提高组 描述 在一个N×M的棋盘上,要求放置K个车,使得不存在一个车同时能被两个车攻击.问方案数. 输入格式 一行三个整数,N,M,K. 输出格式 一行一个整数,代表答案对1000001取模之后 ...

  2. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  3. NOIP2010提高组乌龟棋 -SilverN

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  4. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  5. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  6. [NOIP2015] 提高组 洛谷P2615 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  7. [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...

  8. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  9. [NOIP2012] 提高组 洛谷P1084 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

随机推荐

  1. Java实现第九届蓝桥杯星期一

    星期一 整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一? (不要告诉我你不知道今天是星期几) 注意:需要提交的只是一个整数,不要填写任何多余的内容或说明文字. 解: ...

  2. 总结梳理:webpack中如何使用vue

    1. 安装vue的包 cnpm i vue -S  2. 由于在webpack中,推荐使用 .vue这个组件模板文件定义的组件,所以,需要安装,   能解析这个文件的loader: cnpm i vu ...

  3. Firefox中input元素,不能重新获取焦点函数focus()

    js校验输入框的函数: function is_number(feild) { var strRegExp = /^\d+(\.\d{1,2})?$/; if (!strRegExp.test(fei ...

  4. 【PHP】如何将SESSION数据存放到Redis中

    在php中,SESSION的数据默认是存放到文件中,这样性能不仅不高,而且不利于扩展.在搭建集群后,默认存放到文件中就不适用了.所以,我们一般将SESSION自定义,让SESSION中的数据存放到 数 ...

  5. css布局中的垂直水平居中对齐

    前言 我们都知道,固定高宽的div在网页中垂直居中很简单,相信大家也很容易的写出来,但是不是固定高宽的div如何垂直居中呢?我们在网页布局,特别是手机等web端网页经常是不固定高宽的div,那么这些d ...

  6. 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】

                                                  青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...

  7. MySQL 性能优化之慢查询

    性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句 其次使用explain命令去查询由问题的SQL的执行计划(脑补链接:点我直达1,点我直达2) 最后可以使用show pro ...

  8. 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!

    自序 这次面试的公司有一点点多,主要是因为毕业后前两份工作找的都很草率,这次换工作就想着,emm,毕业三年了,该找个工作好好沉淀几年了. 先说下这次面试的结果吧: 到 hr 面的:阿里.美团.滴滴.金 ...

  9. umi 调试

    最近在umi.  设置一个layout字段, 结果左边菜单栏就出现了. 很神奇. 决定对这个库一探究竟. 我是一个喜欢看底层库的人,网上所有的启动方式都是yarn或者npm start 启动服务.然后 ...

  10. swiper 实现滑动解锁

    最近项目中有这样一个需求,研究了两种写法一个原生,一个使用框架 原生写法: <!DOCTYPE html> <html> <head> <meta chars ...