BZOJ.3293.[CQOI2011]分金币(思路)
先考虑能否断环为链。显然是可以的,因为金币不可能在整个环上平移。所以我们枚举断点\(k\),表示\(k\)和\(k+1\)之间不交换金币。
令\(d_i=a_i-aver\),表示\(i\)需要给\(i-1\)的金币数量,\(d_i\)可正可负(负的就表示\(i-1\)给\(i\) \(d_i\)个金币)。显然没必要再表示\(i-1\)给\(i\)的金币数量啊。
这样再对\(d_i\)求个前缀和\(s_i\),\(|s_i|\)就表示\(i\)位置需转手多少金币。注意因为是均分所以\(s_n=0\)!
那么枚举断点\(k\)后,答案是\(\sum_{i=k+1}^n|s_i-s_k|+\sum_{i=1}^k|s_i+s_n-s_k|\)。(当然要加绝对值啊→_→,求的是区间和的绝对值)
因为\(s_n=0\),所以所求就是\(\sum_{i=1}^n|s_i-s_k|\)。\(s_k\)取中位数时答案最小(向两边移动会造成更多的代价)。
简直傻了啊QAQ,这个题怎么都做了这么长时间啊。。
//1700kb 200ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define abs(x) (x<0?-(x):x)
typedef long long LL;
const int N=1e6+5;
int A[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
int n=read(); LL aver=0;
for(int i=1; i<=n; ++i) aver+=A[i]=read();
aver/=n;
for(int i=1; i<=n; ++i) A[i]=A[i]-aver+A[i-1];
std::nth_element(A+1,A+(n+1>>1),A+n+1);
LL ans=0;
for(int i=1,mid=A[n+1>>1]; i<=n; ++i) ans+=abs(A[i]-mid);
printf("%lld\n",ans);
return 0;
}
BZOJ.3293.[CQOI2011]分金币(思路)的更多相关文章
- BZOJ3293: [Cqoi2011]分金币(数学)
3293: [Cqoi2011]分金币 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1596 Solved: 969[Submit][Status ...
- BZOJ3293: [Cqoi2011]分金币
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...
- bzoj3293 [Cqoi2011]分金币&&bzoj1045 [HAOI2008]糖果传递
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...
- [BZOJ3293] [Cqoi2011] 分金币 (贪心)
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...
- BZOJ1045 [HAOI2008]糖果传递 && BZOJ3293 [Cqoi2011]分金币
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...
- 贪心+数学【p3156】 [CQOI2011]分金币 ([HAOI2008]糖果传递)
题目描述 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. 分析: 设: 每个人最 ...
- CQOI2011分金币&HAOI2008糖果传递
双倍经验…… 没想到白书上竟然有……我还看过……还忘了…… 抄份题解: A1 + X1 - X2 = G A2 + X2 - X3 = G . . . An + Xn - X1 = G 解得 X1 = ...
- P2512 [HAOI2008]糖果传递&&P3156 [CQOI2011]分金币&&P4016 负载平衡问题
P2512 [HAOI2008]糖果传递 第一步,当然是把数据减去平均数,然后我们可以得出一串正负不等的数列 我们用sum数组存该数列的前缀和.注意sum[ n ]=0 假设为链,那么可以得出答案为a ...
- (洛谷P2512||bzoj1045) [HAOI2008]糖果传递 || 洛谷P4016 负载平衡问题 || UVA11300 Spreading the Wealth || (洛谷P3156||bzoj3293) [CQOI2011]分金币
bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p251 ...
随机推荐
- 广工赛-hdu6470矩阵快速幂
递推时把(n+1)^3拆开 构造矩阵即可 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...
- 几种stl的应用
1.set(特点:插入后元素自动从小到大排序) set< int > ::iterator it;//迭代器,可以指向同类型的集合 q.find(k);//其中一个元素k的地址 q.cou ...
- nodeJS有多快
听说nodeJS适用于高并发的场景,一直想测试但是没找到机会 这几天新系统要上线了,老系统的数据需要割接到新的系统中 由于数据量很大,表的结构的发生了很大的改变,割接时间长达9个小时 其中一个模块有1 ...
- 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信
[Arduino]开发入门[十]蓝牙模块 首先show一下新入手的蓝牙模块 蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机 ...
- img 标签的 usemap 属性
<img src="1.gif" alt="Planets" usemap="#Map"/> <map name=&quo ...
- 自动驾驶系统 bfs
一家科技公司有一块试验地用于测试自动驾驶系统.试验地由n×m个格子组成,从上到下依次编号为第1到n行,从左到右依次编号为第1到m列.试验车位于其中的某个格子上,每次自动驾驶系统可以控制汽车往上下左右移 ...
- 003 使用SpringMVC开发restful API--查询用户
一:介绍说明 1.介绍 2.restful api的成熟度 二:编写Restful API的测试用例 1.引入spring的测试框架 在effective pom中查找 2.新建测试包,测试类 3.测 ...
- pyqt text browser 设置文本
pyqt text browser 设置文本 setHtml(u"Html") setPlainText(u"纯文本") setText(u"文本\n ...
- html-字体属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Knn:Knn实现对150朵共三种花的实例的萼片长度、宽,花瓣长、宽数据统计,根据一朵新花的四个特征来预测其种类
from sklearn import neighbors from sklearn import datasets knn = neighbors.KNeighborsClassifier() ir ...