【2019.8.8 慈溪模拟赛 T1】开箱(chest)(暴力DP水过)
2024-08-28 09:45:13
转化题意
这题目乍一看十分玄学,完全不可做。
但实际上,假设我们在原序列从小到大排序之后,选择开的宝箱编号是\(p_{1\sim Z}\),则最终答案就是:
\[\sum_{i=1}^Za_{p_i}(p_{i+1}-p_i)
\]
\]
其中\(p_{Z+1}=n+1\)。
有了这个式子,就可做了许多。
暴力\(DP\)
我们设\(f_{i,j}\)为在前\(i\)个宝箱中选择了\(j\)个宝箱的最小代价。
枚举一个转移点\(k\)表示上个选择的宝箱,就可以得到:
\[f_{i,j}=f_{k,j-1}+(a_k-a_i)(n-i+1)
\]
\]
这虽然是\(O(n^3)\)的,但\(n\)才\(1000\),加上其常数很小,实际实现中又可以将枚举时除以个\(8\),所以能跑过。
斜率优化
比赛时调了一个多小时没调出来。。。加上暴力\(DP\)能过,就没再想了。。。
这里先占个坑吧。
代码(暴力\(DP\))
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000
#define INF 2e9
#define LL long long
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmin(x,y) (x>(y)&&(x=(y)))
using namespace std;
int n,m,a[N+5];
class BruteForceSolver
{
private:
int f[N+5][N+5];
public:
I void Solve()
{
RI i,j,k;for(i=0;i<=n;++i) for(j=0;j<=m;++j) f[i][j]=INF;//初始化
for(f[0][0]=0,j=1;j<=m;++j) for(i=j;i<=n;++i)//枚举i,j
for(k=j-1;k^i;++k) Gmin(f[i][j],f[k][j-1]+1LL*(a[i]-a[k])*(n-i+1));//枚举转移点k进行转移
RI ans=INF;for(i=0;i<=n;++i) Gmin(ans,f[i][m]);printf("%d",ans);//求答案
}
}B;
int main()
{
freopen("chest.in","r",stdin),freopen("chest.out","w",stdout);
RI i;for(scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%d",a+i);sort(a+1,a+n+1);//注意排序
return B.Solve(),0;
}
最新文章
- UWP中实现自定义标题栏
- kettle中变量的设置和使用介绍
- svn 更新命令(冲突时使用theirs)
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- LCA(RMQ)
- centos防火墙设置
- poj 3237 Tree
- Silverlight Visifire控件 .net后台控制aspx页面控件的显示与隐藏,动态给控件赋值,选定默认值的设定
- 基于java自身技术实现消息方式的系统间通信
- ACM-ICPC2018南京赛区 Mediocre String Problem
- Django Cookie和Seesion
- 【Mybatis】MyBatis调用带有返回结果、output参数的存储过程上与ibatis的区别
- 完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五
- 冲刺Two之站立会议1
- Go 源码学习之--net/http
- [javaSE] 网络编程(TCP,UDP,Socket特点)
- 【BZOJ】3674: 可持久化并查集加强版
- Python3实现机器学习经典算法(二)KNN实现简单OCR
- HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)
- MVC涉及RouteTable自定义路径