Codeforce 1175 D. Array Splitting
新鲜热乎的题 Codeforce 1175 D。
题意:给出一个长度为$n$的序列$a$,你需要把它划分为$k$段,每一个元素都需要刚好在其中一段中。分好之后,要计算$\sum_{i=1}^{n} (a_i \centerdot f(i))$,使这个值最大。其中$f(i)$代表第$i$个元素被分在第几段中。简单来说,就是每个元素被分在第几段中就需要乘上几,使序列的和最大。
假设$sum$是$a$的前缀和,$k$个分割点分别为$l_j$,将序列分割为$[1, l_1],[l_1 + 1, l_2]......[l_{k-1} + 1, l_k]$,那么第$j$段对总和的贡献是$(sum_{l_j} - sum_{l_{j-1}}) * j$。
由此,总和应该为$sum_{l_1} + (sum_{l_2} - sum_{l_1}) * 2 + (sum_{l_3} - sum_{l_2}) * 3+……+(sum_{l_k} - sum_{l_{k-1}}) * k$,很显然,相邻两项之间存在可以抵消的部分,同时$l_k$一定为$n$。将其化简:$sum_n \centerdot k - sum_{l_1} - sum_{l_2} -……-sum_{l_{k-1}}$,那么我们只需要在前$n-1$项的前缀和中找出最小的$k-1$个就可以得到最大的总和了。
int n, k;
int a;
ll sum[maxn];
int main() {
scanf("%d %d", &n, &k);
priority_queue<ll, vector<ll>, greater<> > q;
for(int i = ; i <= n; ++i) {
scanf("%d", &a);
sum[i] = sum[i - ] + a;
if(i != n)
q.push(sum[i]);
}
ll ans = sum[n] * k;
for(int i = ; i <= k - ; ++i) {//找出最小的k-1个前缀和
ans -= q.top();
q.pop();
}
printf("%lld\n", ans);
}
Codeforce 1175 D. Array Splitting的更多相关文章
- Codeforces 754A Lesha and array splitting(简单贪心)
A. Lesha and array splitting time limit per test:2 seconds memory limit per test:256 megabytes input ...
- Codeforces 754A Lesha and array splitting (搜索)
题目链接 Lesha and array splitting 设s[i][j]为序列i到j的和,当s[i][j]≠0时,即可从i跳到j+1.目标为从1跳到n+1,所以按照题意暴力即可. #includ ...
- Educational Codeforces Round 69 (Rated for Div. 2) C. Array Splitting 水题
C. Array Splitting You are given a sorted array
- 【codeforces 754A】Lesha and array splitting
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CodeForces - 1175D Array Splitting(数组划分+后缀和+贪心)
You are given an array a1,a2,…,ana1,a2,…,an and an integer kk. You are asked to divide this array in ...
- D. Array Splitting(后缀数组)
You are given an array
- Codeforce 1155D Beautiful Array(DP)
D. Beautiful Array You are given an array aa consisting of nn integers. Beauty of array is the maxim ...
- codeforce 121E - Lucky Array
10^4以内只由4和7构成的数字只有31种,那么做法就很简单了,求出每个数字与其最接近的幸运数的差值,然后建立线段树,线段树维护区间最小值和最小值个数,如果操作过程中最小值<0,那么就去对差值进 ...
- cf754 A. Lesha and array splitting
应该是做麻烦了,一开始还没A(幸好上一次比赛水惨了) #include<bits/stdc++.h> #define lowbit(x) x&(-x) #define LL lon ...
随机推荐
- 即时通讯(II)
Socket 连接Demo Socket客户端代码 #import "ViewController.h" //0.导入头文件 #include <netinet/in.h&g ...
- CtfStudying之SSH私钥泄露
8/23/19 SSH私钥泄露 对于只是给定一个对应ip地址的靶场机器,我们需要对其进行扫描,探测其开放服务.我原来理解的渗透就是找到目标的漏洞,然后利用这些(这种)漏洞,最后拿到机器的最高权限:其实 ...
- paste 合并文件
1.命令功能 paste 用于合并文件的列,把每个文件以列对列的方式,一列列地加以合并. 2.语法格式 paste option file 参数选项 参数 参数说明 -d 指定间隔符合并文件(默 ...
- .iml文件恢复
基于maven的java工程 执行 mvn idea:module可恢复.iml文件
- pandas数据读取(DataFrame & Series)
1.pandas数据的读取 pandas需要先读取表格类型的数据,然后进行分析 数据说明 说明 pandas读取方法 csv.tsv.txt 用逗号分割.tab分割的纯文本文件 pd.read_csv ...
- 记人生中第一场认真打的CF——CF1000(虽然是Virtual participation)
老师说下午要让我们(来自开明的新高一同学)感受一下CF,于是下午2:20我们就集中到了机房.老师教我们用Educational Codeforces Round 46 (Rated for Div. ...
- Linux学习-基于CentOS7的MariaDB数据库的主从复制
一.MySQL主从复制原理 主从同步过程中主服务器有一个工作线程I/O dump thread,从服务器有两个工作线程I/O thread和SQL thread: 主服务器: dump Thread: ...
- HashMap的几种遍历方式(转载)
今天讲解的主要是使用多种方式来实现遍历HashMap取出Key和value,首先在java中如果想让一个集合能够用for增强来实现迭代,那么此接口或类必须实现Iterable接口,那么Iterable ...
- brew安装指定版本的软件
原文:https://www.jianshu.com/p/aadb54eac0a8 在mac中使用 brew install 安装的软件默认都是最新版本的.有时候我们需要旧版本(指定版本)的时候,应该 ...
- 20180910-Java 文档注释
Java 文档注释 Java只是三种注释方式.前两种分别是// 和/* */,第三种被称作说明注释,它以/** 开始,以 */结束. // /* */ /** */ 说明注释允许你在程序中嵌入关于程序 ...