bzoj 1237(dp)
来源:互联网 发布:成都文殊院网络素食 编辑:程序博客网 时间:2024/06/07 10:13
传送门
题解:排序我是想到了的,毕竟能贪心的要先贪心。之后怎么交换呢,肯定是当前数往前放,前面的依次往后平移,交换两个数有1种换法,交换三个数有2种换法。有一个重要结论:所有大于3的数都可以分解成3x+2y的形式,所以就解决啦!对于不少于四个数的序列,直接“平移式”交换一定不如拆成若干个3和2交换优。
再解释一下3x+2y这个东东:
假设出现了一个位置对应a[i],b[i]相等,直接与相邻的交换即可。
假设有k(k>1)个连续位置对应的a[i],b[i]相等,那么k=3x+2y,肯定不会与q(q>3)个位置之前/之后的交换。所以只考虑下图的交换方式:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll INF=2e11;const int MAXN=1e5+4;int n,a[MAXN],b[MAXN];ll f[MAXN]={0},ans=0;inline int read() { int x=0;char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x;}ll cal(int i,int j) { return a[i]^b[j]?abs(a[i]-b[j]):INF;}int main() { n=read(); for (register int i=1;i<=n;++i) a[i]=read(),b[i]=read(); sort(a+1,a+n+1); sort(b+1,b+n+1); for (register int i=1;i<=n;++i) { f[i]=INF; f[i]=min(f[i],f[i-1]+cal(i,i)); if (i>=2) f[i]=min(f[i],f[i-2]+cal(i,i-1)+cal(i-1,i)); if (i>=3) { f[i]=min(f[i],f[i-3]+cal(i,i-2)+cal(i-1,i)+cal(i-2,i-1)); f[i]=min(f[i],f[i-3]+cal(i,i-1)+cal(i-1,i-2)+cal(i-2,i)); } } printf("%lld\n",f[n]^INF?f[n]:-1); return 0;}
阅读全文
0 0
- bzoj 1237(dp)
- bzoj 1237: [SCOI2008]配对 (贪心+DP)
- bzoj 1237: [SCOI2008]配对(DP)
- bzoj 1616(dp)
- bzoj 1037(dp)
- bzoj 1617(dp)
- bzoj 1978(dp)
- bzoj 3384(dp)
- 【bzoj 1237】[SCOI2008]配对 dp
- bzoj 1040(树形DP)
- bzoj 2060(树形DP)
- bzoj 2287(背包dp)
- BZOJ 4621 Tc605 (DP)
- bzoj 4321: queue2 (DP)
- BZOJ 4806 炮(DP)
- bzoj 4922(背包dp)
- bzoj 1907(树形dp)
- bzoj 1060(树形dp)
- python3 包管理工具问题
- static成员理解
- class.forName和Classloader的区别
- 学习Spring boot AOP
- JAVA获取某段时间内的所有日期
- bzoj 1237(dp)
- VC++中,如何定义callback函数和它的触发事件?
- FastDFS分布式文件系统
- 面向对象程序设计上机练习六(类和对象)
- hashTable与布隆过滤器(Bloom Filter)初识
- Android中打开本地doc、pdf、ppt、text等文件功能的实现
- Linux下去掉^M的方法
- 这是我的第一篇csdn博客
- [Android][第一行代码][第 8 章 多媒体]