zoukankan      html  css  js  c++  java
  • bzoj1045

    这是一道七年级数学题你敢信??

    不过用的的确是七上学的“数轴”来解。。。

    首先先求出最后每个人手上的金币数p(这是可知的),

    接着我们列一个玄学方程:a[i]表示第i个人初始的金币数量(确定),b[i]表示第i个人给第i+1个人的金币数(不确定)

    a[i]-b[i]+b[i-1]=p,这样就能够确定关系了;

    然后列出ans=∑|b[i]|,再把前面列出的n个方程相加,转化后发现要求的是:

    给定数轴上的n个点,找出一个到他们的距离之和尽量小的点

    然后利用七年级上的数学知识(好像我也就这水平),求得中位数的点最小,最后进行计算:

    #include<bits/stdc++.h>
    using namespace std;
    long long p,n,c[1000010],a[1000010],e[1000010],ans;
    int main(){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]),p+=a[i];
        a[0]=a[n];
        p/=n;
        for(int i=1;i<=n;i++)c[i]=c[i-1]+a[i]-p;
        stable_sort(c+1,c+n+1);
        int t=-c[(n>>1)+1];
        for(int i=1;i<=n;i++)ans+=abs(c[i]+t);
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    交互式监控工具glances
    性能测试工具Locust
    CentOS 7 安装 PostgreSQL 教程
    Vue表单
    Vue事件处理
    Vue列表渲染
    Vue条件渲染
    Vue中class与style绑定
    GIT命令操作
    Git简介
  • 原文地址:https://www.cnblogs.com/heqingyu/p/8042567.html
Copyright © 2011-2022 走看看