BZOJ 2620 1045 3293 四倍经验 环形均分纸牌问题

本文解析了CQOI与HAOI竞赛中的裸题,强调了数学成分在解决问题中的作用,并通过代码示例展示了如何找到最优解。讨论了算法设计,包括排序、中位数计算和绝对值距离求和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不放题面了,三道都差不多是裸题,CQOI和HAOI是真正的双倍经验,好像可以直接交。

有一些数学的成分,考虑分到中位数是一定最优的。至于证明请找suika,我不会

// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
const int N = 1100000;
long long a[N],n;
long long s[N];
inline char nc() {
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline long long read() {
    long long x=0,f=1;char ch=nc();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=nc();}
    while(isdigit(ch)){x=((x+(x<<2))<<1)+(ch^'0');ch=nc();}
    return x*f;
}
int abs(int x){return x>0?x:-x;}
int main() {
    n=read();
    long long sum=0;
    for(int i=1;i<=n;i++)a[i]=read(),sum+=a[i];
    sum/=n;
    for(int i=1;i<=n;i++)
        s[i]=s[i-1]+a[i]-sum;
    sort(s+1,s+n+1);
    int m = s[n+1>>1];
    long long ans=0;
    for(int i=1;i<=n;i++)
        ans+=abs(s[i]-m);
    printf("%lld\n",ans);
}

 

转载于:https://www.cnblogs.com/Tobichi/p/9184751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值