首页 > 其他分享 >题解【[SCOI2008] 配对】

题解【[SCOI2008] 配对】

时间:2024-05-25 17:01:13浏览次数:11  
标签:minn int 题解 LL back abs SCOI2008 配对

题目链接

如果没有“配对数字不相同”的限制,将 \(a,b\) 数组排序后一 一配对就能得到最小值。

回到原题,考虑一种极端情况,\(\forall i\in [1,n],a_i=b_i\) 即排序后全等。

若 \(n\) 为偶数,一种显然的构造方法是:

1 2 3 4 5 6
2 1 4 3 6 5

即分成两个两个一组,然后组内交换,这样跨越幅度最小,因此最终得出答案最小。

若 \(n\) 为奇数,两个一组显然不行,引入三个一组,比如 1 2 3 可对应 3 1 22 3 1,一定可以得到答案。

但是不需要引入四个一组,因为必然可以拆成“两个+两个”的模式。

回到原问题,设 \(f_i\) 表示前 \(i\) 个元素的答案,那么转移有:

  • \(a_i\) 与 \(b_i\) 配对,\(f_{i-1} \rightarrow f_i\)
  • \(a_i,a_{i-1}\) 与 \(b_i,b_{i-1}\),\(f_{i-2} \rightarrow f_i\)
  • \(a_i,a_{i-1},a_{i-2}\) 与 \(b_i,b_{i-1},b_{i-2}\),\(f_{i-3} \rightarrow f_i\)

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=1e5+10;
int n,a[N],b[N];
LL f[N];

LL calc(int p) {
    vector<int> c;
    LL minn=1e18;
    c.push_back(b[p-2]); c.push_back(b[p-1]); c.push_back(b[p]); 
    do {
        if(c[0]!=a[p]&&c[1]!=a[p-1]&&c[2]!=a[p-2]) {
            minn=min(minn,abs(c[0]-a[p])*1ll+abs(c[1]-a[p-1])+abs(c[2]-a[p-2]));
        }
    } while(next_permutation(c.begin(),c.end()));
    return minn;
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    memset(f,0x3f,sizeof(f));
    f[0]=0;
    for(int i=1;i<=n;i++) {
        if(i>=3)f[i]=calc(i)+f[i-3];
        if(a[i]!=b[i]) f[i]=min(f[i],f[i-1]+abs(a[i]-b[i]));
        if(i>=2&&(a[i]==b[i]||a[i-1]==b[i-1])) f[i]=min(f[i],f[i-2]+abs(a[i]-b[i-1])+abs(a[i-1]-b[i]));
    }
    cout<<f[n];

    return 0;
}

标签:minn,int,题解,LL,back,abs,SCOI2008,配对
From: https://www.cnblogs.com/zhangyuzhe/p/18212618

相关文章

  • Xfce4桌面背景和桌面图标消失问题解决@FreeBSD
    问题:Xfce4桌面背景和桌面图标消失以前碰到过好几次桌面背景和桌面图标消失,整个桌面除了上面一条和下面中间的工具条,其它地方全是黑色的问题,但是这次重启之后也没有修复,整个桌面乌黑一片,啥都没有,用起来特别不得劲,于是开始修复。修复过程咨询文心,建议这样设置:检查壁纸设置:......
  • 【NOI2010】能量采集 题解
    【NOI2010】能量采集题解谨纪念我的第一道手推出来的莫反题。题目大意:已知\(n\),\(m\),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(2\cdot\gcd(i,j)-1)\)。首先变形一手:\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m(2\cdot\gcd(i,j)-1)=2\sum\limits_{i=1}^n\sum\limits_{j=......
  • CF1973F Maximum GCD Sum Queries 题解
    题目链接点击打开链接题目解法首先想到枚举两个数列的$\gcd$,求最小代价两个数列的\(\gcd\)应该分别是\(a_1,b_1\)的因数或\(b_1,a_1\)的因数这样就把枚举范围缩小到了\(d(a_1)\timesd(b_1)\),这求最小代价需要\(O(n)\),不够快假设枚举的\(\gcd\)分别为\(x,y\)......
  • CF1909I Short Permutation Problem 题解
    这是一道*1900的黑。考虑枚举\(m\),将\(<\fracm2\)和\(\ge\fracm2\)的数分开讨论。考虑相邻两个数\(a,b\(a>b)\)分别在\(\fracm2\)的两侧,则有\(b\gem-a\)。考虑将所有数按某种方法从小到大排序,以\(\min(x,m-x)\)为第一关键字,\(-x\)为第二关键字,则排列中......
  • 【达梦问题解决】to_date转换之【文字与格式字符串不匹配】
    【问题描述】因为要转换的值中包含了不属于时间格式的字符(T,Z),这可能是数据迁移时时间参数设置不对导致的。具体没有进行考究【问题解决】使用DATE分隔符解决【手册链接】格式符解释实际分隔符的处理办法【自定义转换函数】这里的自定函数是不完善的,因为我的数......
  • CF1939D Big Persimmon 题解
    题目链接点击打开链接题目解法什么神仙题/jy先把\(a_i\)都\(\times2\),默认一开始先手比后手快\(1\)时间,可以避免两个人同时结束一个柿子的情况朴素的\(dp\)是显然的,令\(f_{l,r,det}\)表示当前剩下区间\([l,r]\)中的柿子,先手比后手快了\(det\)秒,先手最多能比后......
  • 充电桩——微信小程序,缴纳的1000元交易保障金,问题解答。
    1、小程序后台,申请退款保障金有一条不符合要求,无法退款。 2、咨询客服,能否退款然后再以公司名义缴纳保证金,等待回复:暂不支持对公转账,只能微信扫码支付缴纳哈。退保的话,支持退回对公账户。详情请查看小程序交易保证金管理规定https://developers.weixin.qq.com/miniprogram/de......
  • P5531 [CCO2019] Human Error 题解
    可能是一个比较劣的做法。但复杂度是对的。思路我们容易发现状态数非常的稀少。一个比较宽松的上限时\(3^{13}\)种状态由于每个点每走一步会吃掉一个棋子。所以实际的状态是远远达不到这个上限。那么我们可以直接设\(dp_{i,0/1,0/1}\)为在\(i\)状态下,目前是Justin......
  • Codeforces Global Round 12 C2. Errich-Tac-Toe (Hard Version) 题解 构造
    Errich-Tac-Toe(HardVersion)题目描述TheonlydifferencebetweentheeasyandhardversionsisthattokensoftypeOdonotappearintheinputoftheeasyversion.ErrichtogaveMonogonthefollowingchallengeinordertointimidatehimfromtakingh......
  • 蓝桥楼赛第30期-Python-第二天赛题 题解
    楼赛第30期Python模块大比拼解析网页元素目标本次挑战,我们需要使用Python访问软科世界大学排行榜来获取首页30所学校的信息。为避免目标网站的内容发生变化,我们使用保存之后的网页进行实验。链接如下:https://labfile.oss.aliyuncs.com/courses/4070/rank2021.h......