首页 > 其他分享 >CF571B-题解

CF571B-题解

时间:2024-10-18 10:32:45浏览次数:6  
标签:CF571B int 题解 len tot1 now dp

CF571B

题意

给定数组\(A\) 和值\(k\) ,你可以重排\(A\) 中的元素,使得\(\displaystyle\sum_{i=1}^{n-k} |A_i-A_{i+k}|\) 最小。输出最小值。

思路

\(A_i,A_{i+k}\) 就等同于在将 \(i\) 模 \(k\) 的意义上把 \(A\) 分为若干组
贪心的想要使 \(\displaystyle\sum_{i=1}^{n-k} |A_i-A_{i+k}|\) 最小就等同于让每组内的数字差异尽可能小,所以将原数组进行排序。
设 \(dp_{i,j}\) 为选上述第一种组别 \(i\) 次,选第二种组别 \(j\) 次的最小值,对于每个组数字,结果为末项减首项,得到转移方程

dp[i][j]=min(dp[i-1][j]+a[now]-a[now-len]);
dp[i][j]=min(dp[i][j-1]+a[now]-a[now-len+1]);

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5;
int a[N];
int dp[5003][5003];
int n,k,ans;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    memset(dp,0x3f,sizeof(dp));
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    int len=n/k,tot1=n%k,tot2;
    tot2=(n-tot1)/len-tot1;
    dp[0][0]=0;
    for(int i=0;i<=tot1;i++)
        for(int j=0;j<=tot2;j++)
        {
            int k=len*(i+j)+i;
            if(i)dp[i][j]=min(dp[i][j],dp[i-1][j]+a[k]-a[k-len]);
            if(j)dp[i][j]=min(dp[i][j],dp[i][j-1]+a[k]-a[k-len+1]);
            // cout<<k<<" "<<dp[i][j-1]+a[k]-a[k-len+1]<<" "<<dp[i-1][j]+a[k]-a[k-len]<<"\n";
        }
    cout<<dp[tot1][tot2];
    return 0;
}

标签:CF571B,int,题解,len,tot1,now,dp
From: https://www.cnblogs.com/GCSG01/p/18473782

相关文章

  • 【题解】Solution Set - NOIP2024集训Day56 哈希杂题
    【题解】SolutionSet-NOIP2024集训Day56哈希杂题https://www.becoder.com.cn/contest/5640「CF568C」NewLanguage做过的2-sat。「NOI2024」集合做过。做法见提交记录。「CSP-S2022」星战简要题意:给定有向图。修改使一条边失效/恢复;使一个点的所有入边......
  • [YDOI R1] Necklace 题解
    题目传送门前置芝士二项式定理:\((a+b)^n=\sum\limits_{i=0}^{n}C^i_n\timesa^i\timesb^{n-i}\)快速幂Meaning有\(n\)种珠子,每种有\(a_i\)颗,且美丽值为\(v_i\)。任意两颗珠子不同(同种类也算不同)。每种珠子有一个漂亮值\(v_i\)。项链有一个美丽度,若第\(i\)种珠子......
  • Codeforces Round 893 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1858A.Buttons从自身角度出发,我想赢就得保证我的按钮尽可能多所以,大家都优先按\(c\),然后分析先后顺序即可 #include<iostream> #include<string.h> #include<map> #include<vector> #include<set> #include<unordered_set> #......
  • [ABC134F] Permutation Oddness 题解
    [ABC134F]PermutationOddness题解朴素的想法显然是状压dp,枚举选择的子集,但复杂度不可接受。考虑优化。注意到对于\(p_i\),它的贡献只会有两种可能性,\(+p_i,-p_i\)。于是初步的想法是按照\(p_i\)的正负性选择分类。考虑到对于相同正负性的选择\(p\),其是等价的。于是我们......
  • P4229 某位歌姬的故事 题解
    P4229某位歌姬的故事题解\(n\le9\times10^8\),显然复杂度不与\(n\)相关。\(m\le500\),显然可以接受\(O(Tm^2)\)的做法。对于\([l,r]\),考虑套路地将端点离散化,使得复杂度只和关键点个数有关。考虑对于\([l,r,m]\),离散化后被分成了\(a_1,a_2,\cdots,a_p\)段,那么这些段的......
  • ZZJC新生训练赛第四场题解
    ZZJCACM新生训练赛-2024.10.16题目难度Easy(简单):B,C,D,GMedium(中等):A,EAnti-AK(防AK):EC题解题思路A页既可以是彩印也可以是黑白印,B页只能是彩印,所以只要比较A页彩印和A页黑白印的价格高低就好。因为a,b,x,y最大都是1e9,用int直接相乘的话会爆掉,所以......
  • DMA连续发送多帧但是只有最后一帧数据发出问题解决方法
    问题描述DMA连续发送多帧但是只有最后一帧数据发出原因分析DMA发送未完成时,下次DMA请求启动,导致之前的数据被放弃传输了解决办法创建DMA发送缓冲区,当启动DMA请求的时候,检测DMA设备是不是正在忙,如果正在忙,就把数据放入发送缓冲区等待,上次DMA发送完成的时会产生DMA发送完......
  • 【学校训练记录】10月个人训练赛3个人题解
    A:根据题意我们可知,第一种事件为从1到i的和,第二种事件为从y到i的和故我们可以通过前缀和来保存从i到i+1所化的时间。再遍历寻找最小值即可#include<bits/stdc++.h>#defineendl"\n"#defineintlonglongusingnamespacestd;intn,a[1010];voidsolve(){ cin>>n;......
  • 题解:GZOI2024 D2T2 乒乓球
    考场上切了,但是比较神奇的题,应该是蓝/紫。Discription乒乓球\(\text{}\)时间限制:\(\bold{3}\)秒众所周知,一场乒乓球比赛共有两个玩家\(A\)和\(B\)参与,其中一场比赛由多局比赛组成,而每局比赛中又由多盘比赛组成。每盘比赛\(A\)或\(B\)只有一名选手获胜。当其中一名......
  • [题解]P1311 [NOIP2011 提高组] 选择客栈
    P1311[NOIP2011提高组]选择客栈P6032选择客栈加强版只要\([l,r]\)区间之内存在一个\(i\)使得\(w[i]\lep\),这个区间就是符合条件的。所以我们遍历每一个元素\(i\),根据贪心的思想我们维护\([1,i]\)区间内满足\(w[i]\lep\)的最大\(i\),记为\(mp\)。对于每个元素\(i\),寻找\(......