[ACM_暴力] 最多交换k个数的顺序,求a[i]的最大连续和
/*
http://codeforces.com/contest/426/problem/C
最多交换k个数的顺序,求a[i]的最大连续和
爆解
思路:Lets backtrack interval that should contain maximal sum.
To improve it we can swap not more then K minimal elements
in fixed interval to not more K maximal elements not
contained in our interval. As n is quite little we can
do it in any way. Author solution works O(n3?*?log(n)).
*/
#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
#include <queue>
#include <set> using namespace std;
int sum[][],a[];//sum[i][j]保存从i到j的和
int main(){
int n,k,i,j,o,ans;
cin>>n>>k;
for(i=;i<n;i++) cin>>a[i];//输入
memset(sum,,sizeof(sum));//清0
ans=-;//最值
for(i=;i<n;i++){
sum[i][i]=a[i];
if(sum[i][i]>ans) ans=sum[i][i];
for(j=i+;j<n;j++){
sum[i][j]=sum[i][j-]+a[j];
if(sum[i][j]>ans) ans=sum[i][j];
}
}
priority_queue<int> temp;
multiset<int> add;
for(i=;i<n;i++){
for(j=i;j<n;j++){
for(o=i;o<=j;o++){//查找从i到j为负的最小的k个
if(a[o]<) temp.push(a[o]);
if(temp.size()>k) temp.pop();
}
if((j-i+)==temp.size()){//全为负
sum[i][j]=temp.top();
while(!temp.empty()) temp.pop();//清空
}
else{
while(!temp.empty()){//清空
sum[i][j]-=temp.top();//将负的移出
temp.pop();
}
} add.clear();//清空add
//对于非[i,j]部分取k个最大正数
for(o=i-;o>=;o--){
if(a[o]>) add.insert(a[o]);
if(add.size()>k) add.erase(add.begin());
}
for(o=j+;o<n;o++){
if(a[o]>) add.insert(a[o]);
if(add.size()>k) add.erase(add.begin());
}
while(!add.empty()){
sum[i][j]+=*add.begin();
add.erase(add.begin());
}
if(sum[i][j]>ans) ans=sum[i][j];//更新ans
}
}
cout<<ans<<"\n";
return ;
}
[ACM_暴力] 最多交换k个数的顺序,求a[i]的最大连续和的更多相关文章
- hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙
/** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...
- 返回最小的k个数
对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致. 给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数. 测试样例: [1,2,4,3] ...
- 小米笔试题:无序数组中最小的k个数
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...
- 最小的K个数:用快排的思想去解相关问题
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边. 这个函数可以如下实现: int Partit ...
- 【面试题030】最小的k个数
[面试题030]最小的k个数 题目: 输入n个整数,找出其中最小的k个数. 例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4. 思路一: ...
- 九度 1371 最小的K个数
题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行:第一行为2个整数n,k(1<= ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- 寻找最大的k个数问题
这是编程之美书第2.5节的一道题目. 各种解法: 解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个.但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数 ...
随机推荐
- SpringMVC中在web.xml中添加中文过滤器的写法
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>or ...
- Interface, 接口的实现初解
百度是这么说的: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 两种含 ...
- 如何添加ECSHOP广告位置
如何添加ECSHOP广告位置 我们都知道ecshop系统默认的广告位置非常的少,但是一个电子商务网站岂能离开广告?庆幸的是,ecshop预留了足够强大的组件让我们能够完全有可能实现任意我们想要广告位置 ...
- java程序员从ThinkPad到Mac的使用习惯改变
https://blog.csdn.net/yczz/article/details/49993417
- snowflake自增ID算法 (PHP版)
/** * SnowFlake ID Generator * Based on Twitter Snowflake to generate unique ID across multiple * da ...
- 《Ubuntu标准教程》学习总结
第6章 Shell Shell就是一个命令解释器,负责完成用户与内核之间的交互. 目前流行电Shell主要有:Bourne Shell( sh ).Bourne Again Shell( Bash ) ...
- Jmeter中控制某一段脚本失败后重复执行,并在每个HTTP Request名字中加上循环次数
================================================== 1.While Controller之前有一个BeanShell Sampler,用于Init N ...
- devexpress v14.2.3 发布
补丁而已. New Major Features in 14.2 What's New in VCL Products 14.2 Breaking Changes To learn about bre ...
- 前端之css笔记1
1 css引入方式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 2018.10.23 vijo1243生产产品(单调队列优化dp)
传送门 这道单调队列真的有点难写啊. 方程感觉挺简单的. f[i][j]f[i][j]f[i][j]表示在第iii个车间结束前jjj次步骤的最小代价. 然后用单调队列毒瘤优化一下就行了. 代码: #i ...