zoukankan      html  css  js  c++  java
  • 纸牌均分问题

    首先,如果有某序列(a_i),则(sum_{i=1}^n|a_i-k|)取最小值时,k为(a_i)的中位数。(因为如果是pos,则pos向靠近中位数的位置移动能更小),这个性质也能dp

    有n个人站成一排,每个人有(a_i)张纸牌,求最小移动次数使得每个人纸牌数一样,一张纸牌交给旁边的人记为一次移动。
    如果tot是n的倍数,则有解,设t=tot/n
    遍历一遍,对于第i个人,ans+=abs(a[i]-t),a[i+1]-=t-a[i]。
    也就是:(ans=|a_1-t|+|a_2+a_1-2t|+|a_3+a_2+a_1-3t|+dots+|sum_{i=1}^na_i-nt|)
    如果令(s_k=(sum_{i=1}^ka_i)-kt=sum_{i=1}^k(a_i-t))
    (ans=sum_{i=1}^n |s_i|)
    如果(b_i=a_i-t),答案就是b的n个前缀和的绝对值之和。

    如果是n个人站成一圈,那么,必然有两个人之间是没有交换的,将这两个人断开,变成一条链,假设在位置p和p+1之间断开,且s是原序列的前缀和,则新的前缀和从p+1处开始:
    (|s_{p+1}-s_p|)
    (|s_{p+2}-s_p|)
    (dots)
    (|s_n-s_p|)
    (|s_n+s_1-s_p|)
    (dots)
    (|s_n+s_{p-1}-s_p|)
    (|s_n+s_{p}-s_p|)
    如果s是b的前缀和,则(s_n=0)
    (ans=sum_{i=1}^n|s_i-s_p|),欲使ans最小,(s_p)为s的中位数

    有n个人,第i个人站在(x_i)的位置,求使他们站成连续的一列的最小花费。
    显然,每个人的相对位置不变,设最终他们站在点a、a+1、... a+n-1点,则花费
    (ans=sum_{i=1}^n |x_i-(a+i-1)|=sum_{i=1}^n |(x_i-i+1)-a|),所以a是序列:
    (b_i=x_i-i-1)的中位数。

  • 相关阅读:
    【Beta】 第一次Daily Scrum Meeting
    团队作业8——Beta版本冲刺计划及安排
    团队作业7-Alpha冲刺之事后诸葛亮
    团队作业6——展示博客(Alpha)
    团队作业5——测试与发布(Alpha版本)
    【Alpha】——Seventh Scrum Meeting
    敏捷冲刺日志集合帖
    【Alpha】——Sixth Scrum Meeting
    【Alpha】——Fifth Scrum Meeting
    HTTP 协议(2)
  • 原文地址:https://www.cnblogs.com/foursmonth/p/14161865.html
Copyright © 2011-2022 走看看