P2893 [USACO08FEB] Making the Grade G(dp优先队列)
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优先队列)相关推荐
- [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| ...
- 洛谷 P2893 [USACO08FEB]修路Making the Grade 解题报告
P2893 [USACO08FEB]修路Making the Grade 题目描述 A straight dirt road connects two fields on FJ's farm, but ...
- Making The Grade G
Making The Grade G 原题传送门: luogu P2893 USACO08FEB 题目大意: 给定一个长度为 N N N 的序列 A A A 让你构造一个长度也为 N N N ...
- 【BZOJ3131】淘金(SDOI2013)-数位DP+优先队列
测试地址:淘金 做法: 本题需要用到数位DP+优先队列. 令 F ( x , y ) F(x,y) F(x,y)为坐标 ( x , y ) (x,y) (x,y)上的黄金数目,那么: F ( x , ...
- [Luogu P2893][USACO08FEB]修路Making the Grade
题意大致就是求把一段序列改成单调递增或者单调递减最小费用,费用是改前改后的高度之差的绝对值.那就直接用dp去做.我们用dp[i][j]表示把前i段维护成有序的,第i段高度为h[j]时的最小花费.因为我 ...
- 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...
- CCSU团队训练赛 ( A 数学 B tarjan F dij G dp H 线段树 )
题目链接 设的私密,可能进不去,每个题有给原题链接.算作是私人题解吧. A - Play the Dice HDU - 4586 There is a dice with n sides, whic ...
- hdu1058(dp||优先队列)
丑数:一个数的素因子只有2,3,5. Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- POJ3666 Making the Grade(DP)
题意:给定长度为n的序列a,构造长度为n的序列b,满足b单调:最小化 思路:在满足S最小化的情况下,一定存在一种构造序列B的方案,使得B中的数值都在A中出现过:dp[i][j]表示完成前i个数的构造, ...
- *POJ3666.Making the Grade(DP+离散化)
题目链接:http://poj.org/problem?id=3666 题意:求将一个序列调整成纯单调(可以相等)的序列所需要的最小代价 解题思路: 分两种情况讨论: ①不减序列:dp[i][j]表示 ...
最新文章
- 复旦邱锡鹏团队:Transformer最新综述!
- 彻底弄懂css中单位px和em,rem的区别
- OSPF Unicast Multicast and Network Type(OSPF的单播多播与网络类型辩析)
- 红帽企业版linux 7.4更新启动,红帽Linux企业版7.4 淘汰Btrfs文件系统
- 9203 0409 随堂
- centos系统安装python3.8的操作过程 亲测可行 云服务器安装过程 200327
- mac php csv 乱码,php 生成csv mac下乱码
- Unity3D占用内存太大的解决方法【先转,慢慢看】
- python3 socket 接收 bytes 长度 会变,Python解析Socket数据流异常bytes的问题(详细)...
- js系列之每天一练成长录之一
- qstringlist格式怎么写到txt_怎样把PDF转成TXT呢?
- 学经济为什么学python_工具&方法丨划重点 ! 经济学专业学Python需要学哪些内容?——数据分析处理必知必会的知识点...
- Windows Server 2013 安装zune 4.8中文版
- 如何将F4V格式的视频转换成MP4格式
- 计算机怎样辅助英语听力教学,浅议多媒体计算机辅助大学英语教学的原则 大学英语听力怎么提高...
- 把ip导入mysql_纯真IP数据库导入mysql
- linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行
- 测度、线性赋范空间、内积空间
- 微信商户号25位招商银行号
- solrCloud配置