热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeForces714E+POJ3666(dp严格单调递增与非严格单调递增)

左偏树炒鸡棒的论文《左偏树的特点及其应用》虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱……虽然还没想明白为什么,但是应该

左偏树

炒鸡棒的论文《左偏树的特点及其应用》

虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱……

虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大顶堆,非递增小顶堆……

这题和bzoj1367题意差不多,但是那题求的是严格递增。(bzoj找不到那道题,可能是VIP或什么原因?

严格递增的方法就是每一个数字a[i]都要减去i,这样求得的b[i]也要再加i,保证了严格递增(为什么对我就不知道了

代码比较水,因为题目数据的问题,我的代码也就钻了空子,反正ac就好了。。。。

#include
#include

#include

#include

using namespace std;const int N = 2005;
typedef
long long ll;struct LTree {int l, r, sz;int key, dis;bool operator<(const LTree lt) const {return key < lt.key;}
} tr[N];
int cnt_tr;int NewTree(int k) {tr[&#43;&#43;cnt_tr].key &#61; k;tr[cnt_tr].l &#61; tr[cnt_tr].r &#61; tr[cnt_tr].dis &#61; 0;tr[cnt_tr].sz &#61; 1;return cnt_tr;
}
int Merge(int x, int y) {if (!x || !y) return x &#43; y;if (tr[x] < tr[y]) swap(x, y);tr[x].r &#61; Merge(tr[x].r, y);if (tr[tr[x].l].dis < tr[tr[x].r].dis) swap(tr[x].l, tr[x].r);tr[x].dis &#61; tr[tr[x].r].dis &#43; 1;tr[x].sz &#61; tr[tr[x].l].sz &#43; tr[tr[x].r].sz &#43; 1;return x;
}
int Top(int x) {return tr[x].key;
}
void Pop(int &x) {x &#61; Merge(tr[x].l, tr[x].r);
}
int a[N], root[N], num[N];int main() {int n;while (~scanf("%d",&n)) {ll sum, tmp, ans;cnt_tr &#61; sum &#61; tmp &#61; 0;for (int i &#61; 0; i i) {scanf("%d", a&#43;i);sum &#43;&#61; a[i];}int cnt &#61; 0;for (int i &#61; 0; i i) {root[&#43;&#43;cnt] &#61; NewTree(a[i]);num[cnt] &#61; 1;while (cnt > 1 && Top(root[cnt]) 1])) {cnt--;root[cnt] &#61; Merge(root[cnt], root[cnt&#43;1]);num[cnt] &#43;&#61; num[cnt&#43;1];while (tr[root[cnt]].sz*2 > num[cnt]&#43;1) Pop(root[cnt]);}}int px &#61; 0;for (int i &#61; 1; i <&#61; cnt; &#43;&#43;i)for (int j &#61; 0, x &#61; Top(root[i]); j j)tmp &#43;&#61; abs(a[px&#43;&#43;]-x);ans &#61; tmp;printf("%lld\n", ans);}return 0;
}

View Code

&#xff0d;&#xff0d;&#xff0d;&#xff0d;

考虑dp&#xff0c;dp[i][j]表示前i个数&#xff0c;最后一个数是j的最小花费

dp方程&#xff1a;dp[i][j]&#61;min(dp[i-1][k], k≤j) &#xff0b; abs(a[i]-j)

j的范围1e9&#xff0c;是因为对于每一个i来说&#xff0c;当最优解的时候j一定是a数列中的数&#xff0c;所以只需枚举a数列中的值就可以了。

容易想到dp[i-1][k]就不需要另外一层循环就了&#xff0c;同时可以使用滚动数组&#xff08;不使用明显也够

上面求的是不减&#xff0c;求不增把数组到倒过来就可以了。&#xff08;懒&#xff0c;没写。。

时间复杂度O(n^2)&#xff0c;比上面左偏树明显慢了不少。

#include
#include

#include

#include
using namespace std;
const int N &#61; 2005;
const int INF &#61; 0x5f5f5f5f;int dp[N][N];
int a[N], b[N];
int main() {//freopen("in", "r", stdin);int n;scanf("%d", &n);for (int i &#61; 1; i <&#61; n; &#43;&#43;i) {scanf("%d", a&#43;i);b[i] &#61; a[i];}sort(b&#43;1, b&#43;1&#43;n);int last;for (int i &#61; 1; i <&#61; n; &#43;&#43;i) {last &#61; INF;for (int j &#61; 1; j <&#61; n; &#43;&#43;j) {last &#61; min(last, dp[i-1][j]);dp[i][j] &#61; fabs(b[j]-a[i]) &#43; last;}}int ans &#61; INF;for (int i &#61; 1; i <&#61; n; &#43;&#43;i) {ans &#61; min(ans, dp[n][i]);}printf("%d\n", ans);return 0;
}

View Code

 

贪心

https://blog.csdn.net/lycheng1215/article/details/80089004

#include
#include

#include

#include

using namespace std;const int maxn &#61; 2e5 &#43; 7;
int a[maxn];priority_queue<int>s;int main(int argc, char const *argv[])
{
int n;scanf("%d", &n);long long ans &#61; 0;for(int i &#61; 1;i <&#61; n ; i &#43;&#43;) {scanf("%d", &a[i]);//a[i] -&#61; i;
s.push(a[i]);if(s.top() > a[i]){ans &#43;&#61; s.top() - a[i];s.pop();s.push(a[i]);}}printf("%d",ans);return 0;
}

View Code

 

 

单调递增严格就是将a[i] - i 跑 以上就行

转:https://www.cnblogs.com/DWVictor/p/11305631.html



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
提着变形金刚的Oceannk_737
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有