[HAOI2008]糖果传递 结论题

题目描述

\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价。

暴力的做法比较显然,有\(30\)分,这里就不再赘述了。
推一波式子:先考虑一条链的情况,\(a[i]\)为原数组,\(b[i]\)\(a[i]\)每项分别减掉平均数的数组,\(sum1[i],sum2[i]\)分别为\(a[i],b[i]\)的前缀和数组,\(ave\)为平均数。则\(ans\)可表示为\(\sum\limits_{i=1}^{n}|i*ave-sum1[i]|\),再化简得到\(\sum\limits_{i=1}^{n}|sum2[i]|\)。然后是环形的情况,断环为链的位置不同,会变化的量就是前缀和数组。假设断环的位置为\(p\),则前缀和变为\(sum2[k+1]-sum2[k],sum2[k+2]-sum2[k]...\),减掉重复部分就是\(sum2[k]-sum2[1],sum2[k]-sum2[2]...\),所以答案就是\(\sum\limits_{i=1}^{n}|sum2[k]-sum2[i]|\),结论就是\(sum2[k]\)为中位数时是最优的(证明以后再补吧)。照着式子写代码就好了。

#include <cstdio>
#include <algorithm>using namespace std;#define N 1000000int n;
long long sum[N+5], ave;int main() {scanf("%d", &n);long long t, ans = 0;for(int i = 1; i <= n; ++i) scanf("%lld", &t), ave += t, sum[i] = sum[i-1]+t;ave /= n;for(int i = 1; i <= n; ++i) sum[i] -= i*ave;nth_element(sum+1, sum+(n+1)/2, sum+n+1);for(int i = 1; i <= n; ++i) ans += abs(sum[(n+1)/2]-sum[i]);printf("%lld", ans);return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/9795849.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(34):巩固练习

/1 使用Eclipse编写控制台应用程, 提示老师预计输入&#xff1f;个学生成绩&#xff0c;接收此数后&#xff0c;最为创建int类型数组的大小限制&#xff0c; 使用循环统计包含N个元素的数组&#xff0c;对包含的成绩进行统计&#xff0c;计算如下&#xff1a; 共接收成绩数量是…

artTemplate/template.js模板将时间戳格式化为正常的日期

1&#xff1a;引用<script type"text/javascript" src"../js/artTemplate/template.js"></script> 2&#xff1a;在正常渲染中引入方法 | timestamp: yyyy-MM-dd hh:mm:ss <div>开始时间<span>{{value.endTime | timestamp: yyyy-…

java学习(35):巩固练习

/2使用Eclipse编写控制台应用程,将给定的如下数组进行互换存储&#xff0c;互换原则如下所示 源整型数组 { 56,28,15,999,30,65,12,77} 互换后数组元素排列 {77, 12,15,999,30,65, 28, 56}/ public class test04 { public static void main(String[] args){ int[] arr{56,28,15…

java 并发 主键_高并发数据库自增主键分析

在一般情况下&#xff0c;在新增领域对象后&#xff0c;都需要获取对应的主键值。使用应用层来维护主键&#xff0c;在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里&#xff0c;如果JDBC驱动不能绑定新增记录对应的主键&#xff0c;就需要…

单实例数据库和多实例数据库

java持续学习中&#xff0c;暂时说说工作上学到的知识 单实例数据库模式 单实例模式下,一个数据库只能通过一个实例进行访问 RAC(Real Application Clusters)集群模式下,共享数据库文件,一个数据库生成多个相同的实例被用户访问。

java list 从0开始_Java从零开始学二十一(集合List接口)

package com.pb.demo1;import java.util.LinkedList;import java.util.List;public class PersonLinkedListTest {public static void main(String[] args) {/** 创建多个Person对象并赋值*/Person p1 new Person("张三",21);Person p2 new Person("李四"…

[Swift]LeetCode482. 密钥格式化 | License Key Formatting

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

oracle用户相关操作

我们主要学习数据库的一些基本操作&#xff0c;比如如何在数据库创建用户&#xff0c;授权&#xff0c;删除用户&#xff0c;回收权限&#xff0c;为用户加锁或者解锁等一些常用的操作。 首先&#xff0c;我们要知道数据库中创建用户的语句怎么写&#xff0c;看下面: 1.创建用户…

java显示时间_Java如何显示日期和时间?

在Java中&#xff0c;如何显示当前日期和时间&#xff1f;此示例显示如何使用Formatter类的fmt.format()方法和Calendar类的Calendar.getInstance()方法来显示当前日期和时间。package com.yiibai;import java.text.SimpleDateFormat;import java.util.Calendar;import java.ut…

小程序返回上一页并传参

点击返回上一页事件&#xff1a; returnPre:function(e){let pages getCurrentPages();let prevPage pages[pages.length - 2];prevPage.setData({discount: e.currentTarget.dataset.discount,})wx.navigateBack({delta: 1,})} 其中getCurrentPages() 函数用于获取当前页面栈…

Oracle数据库操作

一、Oracle数据库操作 1、创建数据库 create database databasename 2、删除数据库 drop database dbname 3、备份数据库 • 完全备份 exp demo/demoorcl buffer1024 filed&#xff1a;\back.dmp fully demo&#xff1a;用户名、密码 buffer: 缓存大小 file: 具体的备份文件地址…

java监听器原理_java监听器原理

import java.awt.event.ItemListener; import java.awt.event.ItemEvent; import javax.swing.JFrame; import javax.swing.JComboBox; public class ComBoxDemo extends JFrame { JComboBox computer; //主类别下拉框 JComboBox fittings; //配件下拉框 public ComBoxDemo() {…

Django的各种初识

1,django项目的各个文件的介绍 1.1>项目的根目录:是各个子文件的根目录,在各个文件相互导入文件的时候使用 1.2>配置文件:为django的各个文件配置相关的各种默认配置 1.3>路径和函数的对应关系:是当form表单提交数据的时候和有关于网址的东西都会来urls来查找向对应的…

IIS介绍

IIS7及以上版本提供的请求-处理架构包括以下内容&#xff1a; • Windows Process Activation Service(WAS)可以让站点支持更多协议&#xff0c;不仅仅是HTTP和HTTPS • 可以通过增加或移除模块来自定义Web服务器引擎 • 集成IIS和ASP.NET请求-处理管线 IIS中的组件 IIS包含多个…

mysql 三级联动_c#+Mysql 实现三级联动

注明&#xff1a;此文章是转载而来&#xff0c;只是稍稍改了一点。。。1、实现语言&#xff0c;c#&#xff0c;mysql,其中要引入mysq.dll需要建立三个表----对应关系2、Web.cofig3、demo.cx文件:private string conn WebConfigurationManager.ConnectionStrings["Conn&qu…

Linux卸载MariaDB

CentOS7.5 安装MySQL8.0.12 安装前&#xff1a;  先卸载 CentOS7.5默认安装的MariaDB&#xff0c;配置文件在/etc/my.cnf rpm -qa | grep mariadb 找到 使用 yum remove mariadb-libs-5.5.56-2.el7.x86_64 再次查找 rpm -qa | grep mariadb 同时,配置文件在/etc/my.cnf 也已经…

win10安装iis(亲测,工作需要)

• 点击“Windows”键进入“开始”菜单&#xff0c;点击“所有应用”&#xff0c;在所有应用菜单里点击“Windows系统”里的“控制面板” • 在控制面板对话框里点击“程序” • 在“程序”对话框里点击“启用或关闭Windows功能” • 在“Windows功能”对话框里选中“Interne…

视频展示

作业要求&#xff1a;https://edu.cnblogs.com/campus/nenu/2018fall/homework/2189 视频链接&#xff1a;http://v.youku.com/v_show/id_XMzg2Mzg1NzE0OA.html 视频播放截图及介绍&#xff1a; 1.成语考试中&#xff1a; 2.少年面对成语难得直挠头&#xff1a; 3.父亲发现孩子…

java学习(36):数组排序

/3使用Eclipse编写控制台应用程&#xff0c;接收老师输入的某个学生本学期的5此Java成绩考核&#xff0c; 并存储在5个长度的int类型数组中&#xff0c;对数组中的成绩进行从大到小排序&#xff0c;最后依次变量数组中的元素输出到控制台&#xff0c;如下示例&#xff1a; 源成…

java 8 io_Java IO8:IO简单总结

字节流、字符流继承关系前几篇文章讲解了字节流、字符流的使用&#xff0c;不过Java提供给用户的流类远不止此&#xff0c;限于篇幅原因&#xff0c;没办法一一讲解&#xff0c;而且也没有必要一一讲解&#xff0c;就像我在写博客的时候多次提到的&#xff0c;有问题的时候学会…