Codeforces Round #787 (Div. 3) G. Sorting Pancakes
Sorting Pancakes
题面翻译#
题意简述#
有 个箱子和 个小球,初始时第 个箱子有 个小球。每次操作可以将一个小球移到相邻的箱子里。求要使得最终数组 的最小操作次数。
输入格式#
第一行两个正整数 。
第二行 个非负整数 。数据保证 。
输出格式#
输出一行一个非负整数,表示答案。
数据规模#
样例 #1#
样例输入 #1#
6 19
5 3 2 3 3 3
样例输出 #1#
2
样例 #2#
样例输入 #2#
3 6
3 2 1
样例输出 #2#
0
样例 #3#
样例输入 #3#
3 6
2 1 3
样例输出 #3#
1
样例 #4#
样例输入 #4#
6 19
3 4 3 3 5 1
样例输出 #4#
3
样例 #5#
样例输入 #5#
10 1
0 0 0 0 0 0 0 0 0 1
样例输出 #5#
9
提示#
In the first example, you first need to move the pancake from the dish , after which . After that, you need to move the pancake from the dish to the dish and the array will become non-growing .
思路#
注意到数据范围都很小,可以使用 复杂度的算法通过本题。
首先我们将整个数组翻转过来,考虑将数组变成一个单调不减的数组。
考虑 ,令 f[i][j][k]
表示前 个箱子,一共使用了 个小球,且第 个箱子放了 个小球的最小移动次数,f[i][j][k]
可以转移到 f[i][j + p][p](p >= k)
,从f[i][j][k]
转移到 f[i][j + p][p]
所需要的代价就是 abs(s[i] - j - k)
,但是这么转移是 。 考虑优化,由于f[i][j + p][p](p >= k)
,因此我们可以在转移的时候维护一个 ,复杂度优化为 。
CODE#
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 252;
int a[N], s[N], f[N][N][N];
template < typename T >
inline void chkmax(T &x, T y) {x = x >= y ? x : y;}
template < typename T >
inline void chkmin(T &x, T y) {x = x <= y ? x : y;}
int main() {
int n, m; scanf("%d%d", &n, &m);
//f[i][j][k], 第i个箱子有j个球,并且前i个箱子有k个
for (int i = n; i >= 1; i -- ) scanf("%d", a + i);
for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i];
memset(f, 0x3f, sizeof f);
f[0][0][0] = 0;
for (int i = 1; i <= n; i ++ ) {
for (int j = 0; j <= m; j ++ ) {
int mi = 1 << 30;
for (int k = 0; j + k <= m; k ++ ) {
chkmin(mi, f[i - 1][j][k]);
chkmin(f[i][j + k][k], mi + abs(s[i] - j - k));
}
}
}
printf("%d\n", *min_element(f[n][m], f[n][m] + m + 1));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现