P2893 [USACO08FEB] Making the Grade G(dp&优先队列)

一个结论就是:修改后的值一定在 原序列出现过,这样是最优的。

将aia_iai​ 离散化递增排序得到bbb

以递增为例子,然后就很显然令dp(i,j)=min(dp(i,j),dp(i−1,k)+abs(ai−bj)),k∈[1,j]dp(i,j)=min(dp(i,j),dp(i-1,k)+abs(a_i-b_j)),\ k \in [1,j]dp(i,j)=min(dp(i,j),dp(i−1,k)+abs(ai​−bj​)), k∈[1,j]

这里min(dp(i−1,,k))min(dp(i-1,,k))min(dp(i−1,,k)) 可以前缀和优化。

这样复杂度:O(n2)O(n^2)O(n2)

递减同理。

#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int n,m,minf[2009][2009],f[2009][2009],a[2009],b[2009],t[2009],ans;
void ini()
{for (int i=0;i<=n;i++)for (int j=0;j<=m;j++)minf[i][j]=f[i][j]=0;
}
void dp()
{for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){f[i][j]=minf[i-1][j]+abs(a[i]-b[j]);if (j!=1) minf[i][j]=min(minf[i][j-1],f[i][j]);else minf[i][j]=f[i][j];}
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) {scanf("%d",&a[i]);t[i]=a[i];}sort(t+1,t+1+n);int now=-1;for (int i=1;i<=n;i++) if (now!=t[i]) b[++m]=t[i],now=t[i];ini(); dp(); ans=minf[n][m]; for (int i=1;i<=m/2;i++) swap(b[i],b[m-i+1]);ini(); dp(); ans=min(ans,minf[n][m]);printf("%d\n",ans);return 0;
}

更优的做法是用大根堆,每次丢aia_iai​进堆,若比堆顶小,则把堆顶改成aia_iai​。

花费(x−y)(x-y)(x−y)的费用,尽可能让(y′)(y')(y′)最小,所以最优的情况就是top=aitop= a_itop=ai​,也就是说尽可能让前面的最大值最小,保证后面空间更大。

时间复杂度:O(nlogn)O(nlogn)O(nlogn)

// Problem: P2893 [USACO08FEB] Making the Grade G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2893
// Memory Limit: 125 MB
// Time Limit: 3000 ms
// Date: 2022-06-30 22:45:26
// --------by Herio--------#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
template <typename T>     //x=max(x,y)  x=min(x,y)
void cmx(T &x,T y){if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){if(x>y) x=y;
}
int n;
ll ans=0;
int a[N];
int main(){scanf("%d",&n);rep(i,1,n) scanf("%d",&a[i]);priority_queue<int>q;rep(i,1,n){int x = a[i];q.push(x);//printf("%d %d\n",x,q.top());if(x<q.top()){ans+=q.top()-x;q.pop();q.push(x);}}ll s =0;priority_queue<int,vector<int>,greater<int> >q1;rep(i,1,n){int x = a[i];q1.push(x);if(x>q1.top()){s+=x-q1.top();q1.pop();q1.push(x);}       }//printf("%lld %lld\n",ans,s);printf("%lld\n",min(ans,s));return 0;
}

P2893 [USACO08FEB] Making the Grade G(dp优先队列)相关推荐

  1. [USACO08FEB]Making the Grade G 和 CF714E

    Making the Grade G 题意: 一个农夫需要修路,每一段路的海拔为 A i A_i Ai​,修改后的海拔为 B i B_i Bi​,花费为 ∣ A i − B i ∣ |A_i-B_i| ...

  2. 洛谷 P2893 [USACO08FEB]修路Making the Grade 解题报告

    P2893 [USACO08FEB]修路Making the Grade 题目描述 A straight dirt road connects two fields on FJ's farm, but ...

  3. Making The Grade G

    Making The Grade G   原题传送门: luogu P2893 USACO08FEB   题目大意: 给定一个长度为 N N N 的序列 A A A 让你构造一个长度也为 N N N ...

  4. 【BZOJ3131】淘金(SDOI2013)-数位DP+优先队列

    测试地址:淘金 做法: 本题需要用到数位DP+优先队列. 令 F ( x , y ) F(x,y) F(x,y)为坐标 ( x , y ) (x,y) (x,y)上的黄金数目,那么: F ( x , ...

  5. [Luogu P2893][USACO08FEB]修路Making the Grade

    题意大致就是求把一段序列改成单调递增或者单调递减最小费用,费用是改前改后的高度之差的绝对值.那就直接用dp去做.我们用dp[i][j]表示把前i段维护成有序的,第i段高度为h[j]时的最小花费.因为我 ...

  6. 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...

  7. CCSU团队训练赛 ( A 数学 B tarjan F dij G dp H 线段树 )

    题目链接 设的私密,可能进不去,每个题有给原题链接.算作是私人题解吧. A - Play the Dice HDU - 4586  There is a dice with n sides, whic ...

  8. hdu1058(dp||优先队列)

    丑数:一个数的素因子只有2,3,5. Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276 ...

  9. POJ3666 Making the Grade(DP)

    题意:给定长度为n的序列a,构造长度为n的序列b,满足b单调:最小化 思路:在满足S最小化的情况下,一定存在一种构造序列B的方案,使得B中的数值都在A中出现过:dp[i][j]表示完成前i个数的构造, ...

  10. *POJ3666.Making the Grade(DP+离散化)

    题目链接:http://poj.org/problem?id=3666 题意:求将一个序列调整成纯单调(可以相等)的序列所需要的最小代价 解题思路: 分两种情况讨论: ①不减序列:dp[i][j]表示 ...

最新文章

  1. 复旦邱锡鹏团队:Transformer最新综述!
  2. 彻底弄懂css中单位px和em,rem的区别
  3. OSPF Unicast Multicast and Network Type(OSPF的单播多播与网络类型辩析)
  4. 红帽企业版linux 7.4更新启动,红帽Linux企业版7.4 淘汰Btrfs文件系统
  5. 9203 0409 随堂
  6. centos系统安装python3.8的操作过程 亲测可行 云服务器安装过程 200327
  7. mac php csv 乱码,php 生成csv mac下乱码
  8. Unity3D占用内存太大的解决方法【先转,慢慢看】
  9. python3 socket 接收 bytes 长度 会变,Python解析Socket数据流异常bytes的问题(详细)...
  10. js系列之每天一练成长录之一
  11. qstringlist格式怎么写到txt_怎样把PDF转成TXT呢?
  12. 学经济为什么学python_工具&方法丨划重点 ! 经济学专业学Python需要学哪些内容?——数据分析处理必知必会的知识点...
  13. Windows Server 2013 安装zune 4.8中文版
  14. 如何将F4V格式的视频转换成MP4格式
  15. 计算机怎样辅助英语听力教学,浅议多媒体计算机辅助大学英语教学的原则 大学英语听力怎么提高...
  16. 把ip导入mysql_纯真IP数据库导入mysql
  17. linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行
  18. 测度、线性赋范空间、内积空间
  19. 微信商户号25位招商银行号
  20. solrCloud配置

热门文章

  1. html校验邮箱格式,邮箱格式验证 方法总结
  2. 深度linux怎样设置显卡,在Deepin系统中安装英伟达NVIDIA显卡驱动的方法
  3. GSAP动画效果三——3D动画
  4. android SDL系列讲解(十三) 播放音乐库 SDL_mixer教程
  5. Android studio添加依赖是什么意思以及添加依赖的方法
  6. 芯邦主控芯片CBM2199E量产工具设置
  7. alg 停用sip_为什么使用3CX要关闭SIP ALG
  8. 计算机网络误区——可以通过非ARP报文(正常数据包)学习ARP表项吗?
  9. 创建局域网Git服务器
  10. IE浏览器被删除后添加失败的恢复指南