[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个数 ...
随机推荐
- Idea多个module下maven的pom.xml失效的问题
今天在Idea中配置spring-cloud时,配置了两个module,结果其中一个module的pom.xml失效了.. 解决方法: 1.点击Idea右侧的Maven Project 2.点击&qu ...
- 72. Edit Distance (String; DP)
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- tortoise svn 请求的名称有效,但是找不到请求的类型的数据
可能是博客园出bug了,现在无法放图,间断重复刷新十多次依然如故,弃之 这个问题是在安装完svn服务器(visual svn)后复制url,tortoise svn import 粘贴url后 出现的 ...
- snowflake自增ID算法 (PHP版)
/** * SnowFlake ID Generator * Based on Twitter Snowflake to generate unique ID across multiple * da ...
- 利用ks构建ISO中的一些坑
构建ISO的基本流程 1.获取rpm包源码 2.将源码增量编译成二进制包 3.编写ks的包列表决定ISO制作时需要从什么地方(二进制仓库repo)取哪些二进制包 4.通过createiso命令并指定k ...
- 带你认识那些App可靠性设计
可靠性是软件一个重要的质量属性,它关注的是软件功能持续的可用性,以及出现故障之后是否能够容错,是否能快速的恢复使用. 可靠性六条基本准则 1.故障应在第一时间被检测和感知: 2.能避免的故障都不应该发 ...
- 2. Get the codes from GIT
Clone the code from git.
- system v消息队列demo(未编译)
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> ...
- ELMAH 使用
之前大部分系统日志记录是使用log4net.ObjectGuy Framework.NLog 等工具记录到文本或数据库. 更强大的工具可以使用 ELMAH. ELMAH(The Error Loggi ...
- Devexpress VCL Build v2014 vol 14.2.5 发布
和xe8 几乎同一天出来,但是目前官方不支持xe8. The following sections list all minor and major changes in DevExpress VCL ...