题意
现在,有一个n∗nn * nn∗n的网格图,左下角坐标是(1,1)(1, 1)(1,1),右上角坐标是(n,n)(n, n)(n,n)。有一个小SBSBSB正在坐标为(n,1)(n, 1)(n,1)的位置,每一时刻,如果他现在在(x,y)(x, y)(x,y),他可以选择走到(x−1,y+1)(x -1,y + 1)(x−1,y+1) 或者(x,(y+1) div 2)(x, (y + 1)\ div\ 2)(x,(y+1) div 2),如果选择后者,他要支付BxB_xBx的代价。
其中BBB为数组AAA的后缀和。
思路
首先可以想到动态规划,乱搞一下O(N2)O(N^2)O(N2),只有50分。
然后看一下题解发现是合并果子,直接怒切。
有待研究~
代码
#pragma GCC optimize(2)
#include<queue>
#include<cstdio>
std::priority_queue<int> q;
int t, n;
long long ans;
long long input() {
char c = getchar();
int f = 1;
long long result = 0;
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
result = result * 10 + (c - 48);
c = getchar();
}
return result * f;
}
void print(long long x) {
if (x > 9) print(x / 10);
putchar(x % 10 + 48);
}
int main() {
t = input();
for (; t; t--) {
n = input();
ans = 0;
int x, y;
for (int i = 1; i <= n; i++) {
x = input();
q.push(-x);
}
while ((int)q.size() >= 2) {
x = -q.top();
q.pop();
y = -q.top();
q.pop();
ans += x + y;
q.push(-x - y);
}
q.pop();
print(ans);
putchar(10);
}
}
本文探讨了一个关于网格图上的动态规划问题,通过分析一个n*n的网格图中,小SB从特定位置出发,如何选择路径并优化成本。文章介绍了动态规划的初始想法,即O(N^2)的解决方案,随后提出了一种更高效的合并果子算法,实现快速求解。
222

被折叠的 条评论
为什么被折叠?



