Codeforces 1254B1 - Send Boxes to Alice (Easy Version)
题意
有\(n(1\leq n\leq 10^5)\)个盒子,每个盒子有\(a_i(0\leq a_i \leq 1)\)个糖果,你每一次可以将第\(i\)个盒子里的糖果放到第\(i-1\)或\(i+1\)个盒子中(如果盒子存在)。最后要使每个盒子的糖果数量都整除\(k(k>1)\)(注意盒子可以为空),问最小操作数。
分析
\((1)\)因为糖果是类似于平铺的形式,堆叠时,我们可以发现所有存在糖果的盒子中数量均为\(k\)。若存在一个盒子中有\(2*k\)个糖果,在平铺到堆叠的过程中,将另外\(k\)个糖果分在更近的盒子能得到更小的答案。
\((2)\)设糖果总数为\(cnt\),所有存在糖果的盒子数量均为\(k\),我们又可以发现,最小的操作是将\(1\)~\(k\)、\(k+1\)~\(2k\)、……、\(i*k+1\)~\((i+1)*k\)放在一起,即将相邻的\(k\)个放在一堆。
\((3)\)对于某\(k\)个糖果,需要找到一个盒子,这个盒子到这\(k\)个糖果的距离最小(kNN算法)。我们将糖果看成数轴上的点,运用高一的绝对值知识(我忘了,我向高中数学老师谢罪)。
- 若\(k\)为奇数,则将该盒子设置为最中间糖果所在的盒子
- 若\(k\)为偶数,则将该盒子设置为最中间两个糖果中任意一个所在的盒子
即对于\(i*k+1\)~\((i+1)*k\)来说,第\(k-i/2\)个盒子,设其坐标为\(ave\)。
\((4)\)为降低时间复杂度,我们采取前缀的思想,\(sum[i]\)表示坐标\(i\)之前的糖果的坐标总和(没糖果的盒子不加),\(num[i]\)表示坐标\(i\)之前有多少糖果。
\((5)\)枚举可以被\(cnt\)整除的\(k\),模拟\((2)\)的过程,设\(first\)为第\(i*k+1\)个糖果的坐标,\(last\)为第\((i+1)*k\)个糖果的坐标,那么每个循环都得加上\((num[ave] - num[first - 1])*ave-(sum[ave] - sum[first - 1])+(sum[last] - sum[ave])-(num[last] - num[ave])*ave\),意思为\(ave\)之前的操作次数加上\(ave\)之后的操作次数,最后取最小值
\((6)\)记得开\(long\ long\),\(INF\)也记得开大一点。
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define LL long long
#define pii pair<int,int>
#define int ll
using namespace std;
const int maxn = (ll) 1e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f3f3f3f3f;
int a[maxn];
int cnt = 0;
int sum[maxn];
int num[maxn];
signed main() {
start;
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
num[i] = num[i - 1] + x;//前缀数量
if (x) {
a[++cnt] = i;
sum[i] = i;
}
}
for (int i = 1; i <= n; ++i)//前缀坐标和
sum[i] += sum[i - 1];
int ans = inf;
for (int i = 2; i <= cnt; ++i) {
if (cnt % i == 0) {
int tmp = 0;
for (int k = i; k <= cnt; k += i) {//k为最后的糖果
int first = a[k - i + 1];
int last = a[k];
int ave = a[k - i / 2];
int num1 = num[ave] - num[first - 1];
int num2 = num[last] - num[ave];
int tot1 = sum[ave] - sum[first - 1];
int tot2 = sum[last] - sum[ave];
int t = num1 * ave - tot1 + tot2 - num2 * ave;
tmp += t;
}
ans = min(ans, tmp);
}
}
if (ans == inf)
cout << -1;
else
cout << ans;
return 0;
}
Codeforces 1254B1 - Send Boxes to Alice (Easy Version)的更多相关文章
- Codeforces Round #601 (Div. 2) E1 Send Boxes to Alice (Easy Version)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ; int a[N]; int n; bool pr ...
- E1.Send Boxes to Alice(Easy Version)//中位数
发送盒子给Alice(简单版本) 题意:准备n个盒子放巧克力,从1到n编号,初始的时候,第i个盒子有ai个巧克力. Bob是一个聪明的家伙,他不会送n个空盒子给Alice,换句话说,每个盒子里面都有巧 ...
- E1. Send Boxes to Alice (Easy Version)
题解: 保存每个1的位置.然后记录1的总个数cnt,如果存在一个k使得这个k是每个集合的倍数,那么为了使操作次数最小,这个k应该是cnt的质因子.(因为都是每个集合的数目1,使每个集合的数目变为2需要 ...
- Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version)
Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) N个盒子,每个盒子有a[i]块巧克力,每次操作可以将盒子中的 ...
- Codeforces1254B2 Send Boxes to Alice (Hard Version)(贪心)
题意 n个数字的序列a,将i位置向j位置转移x个(a[i]-x,a[j]+x)的花费为\(x\times |i-j|\),最终状态可行的条件为所有a[i]均被K整除(K>1),求最小花费 做法 ...
- Codeforces 1255E Send Boxes to Alice(前缀和+枚举+数论)
我们考虑前缀和sum[i],如果将a[i+1]中的一个塞入a[i]中,则不影响sum[i+1],但是sum[i]++,如果将a[i]中的一个塞入a[i+1],则不影响sum[i+1],但是sum[i] ...
- E2. Send Boxes to Alice (Hard Version)
秒的有点难以理解:https://blog.csdn.net/weixin_42868863/article/details/103200132 #include<bits/stdc++.h&g ...
- Send Boxes to Alice
E. Send Boxes to Alice 首先求出每一个位置的前缀和. 对答案进行复杂度为\(\sqrt{a[n]}\)的遍历,因为最后的答案不可能大于\(\sqrt{a[n]}\) for(ll ...
- 【Codeforces 1108E1】Array and Segments (Easy version)
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 枚举最大值和最小值在什么地方. 显然,只要包含最小值的区间,都让他减少. 因为就算那个区间包含最大值,也无所谓,因为不会让答案变小. 但是那些 ...
- 【Codeforces 1118D1】Coffee and Coursework (Easy version)
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 从小到大枚举天数. 然后贪心地,从大到小分配a[i]到各个天当中. a[n]分配到第1天,a[n-1]分配到第2天,...然后a[n-x]又分 ...
随机推荐
- 【重学C++】03 | 手撸C++智能指针实战教程
文章首发 [重学C++]03 | 手撸C++智能指针实战教程 前言 大家好,今天是[重学C++]的第三讲,书接上回,第二讲<02 脱离指针陷阱:深入浅出 C++ 智能指针>介绍了C++智能 ...
- react 代码自动格式化
咦写了几行代码发现保存后没有被格式化? import React from "react"; import {Row,Col } from "antd"; ex ...
- 【实践篇】手把手教你落地DDD
1. 前言 常见的DDD实现架构有很多种,如经典四层架构.六边形(适配器端口)架构.整洁架构(Clean Architecture).CQRS架构等.架构无优劣高下之分,只要熟练掌握就都是合适的架构. ...
- 资源高效搜索方法,你 Get 到了吗?
随手转发给好友和朋友圈 编辑:办公小通 百度搜索谁都会,但是搜出来的资料往往良莠不齐.搜索速度是快了,但是还要花大量的时间去筛选. 通过下面的两个最常用的栗子,小通强烈推荐大家用高级搜索. 高级 ...
- IM1281B电能计量模块_C语言例程
一.前言 毕设采用了艾锐达公司的IM1281B电量计能模块,找了一圈没发现具体的51单片机的例程,现在写个能使用的C语言例程,方便以后的开发者们. 二.事前准备 引脚定义: 引脚 功能说明 V+ 供电 ...
- CANoe学习笔记(一):创建第一个仿真工程(基于CAN):点灯
目录 内容: ①创建两个节点,Switch和Light节点 ②创建两个Panel界面 ③capl代码实现Switch控制Light亮灭 事先准备: 养成良好的习惯,将不同文件放入不同文件夹,创建如下几 ...
- rust cargo build一直出现 Blocking waiting for file lock on package cache
如果确定没有多个程序占用,可以删除rm -rf ~/.cargo/.package-cache,然后再执行
- 基于JavaFX的扫雷游戏实现(一)——整体概述
我在不要更新挑战中坚持了一年,你也来试试吧(咕咕咕)! 好言归正传,本次更新带来的是经典游戏扫雷,基于JavaFX实现.篇幅有限,文章主要介绍核心操作实现,不会列出所有代码.需要完整源码或是想预览 ...
- 【Java】并行执行任务
在实际的应用上,我们平时需要调用第三方的接口,可能会调用多个接口,串行执行的话, 就需要等待所有的接口调用完成之后才获取到结果,那我们有没有并行的方法的呢? 串行执行 以下是三个接口,假设他们额的执行 ...
- 我不知道的threejs(6)-开发中的容易被忽略的
在threejs Editor中调好一些样式属性后, 可以直接选择导出具体的格式,或者导出成json[json 一般体积大很多,比glb](场景,通过objectLoader 加载json!!!) 自 ...