[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个数 ...
随机推荐
- Python的logging,记录log的包
最近在做自动化测试时,想给他加上日志,所以用到logging的模块,以下是python增加log的几种方式 一.python代码配置方式(当然还有一种是可以多模块通用的一个python代码设置,这个网 ...
- webrtc 开发之前必须了解的东西
1.创建offer的时候带上参数:{ offerToReceiveAudio: true, offerToReceiveVideo: true } 2.onicecandidate 必须写在 setL ...
- Xcrysden-2
XCrySDen -- (X-Window) CRYstalline Structures and DENsities Introduction to use. XCrySDen is a cryst ...
- HTML5 historyState pushState、replaceState
DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,让你可以在用户的访问记录中前进和后退. 从HTML5开始,我们可以开始操作这个历史记录堆栈. 1.Histo ...
- Petya and Graph(最小割,最大权闭合子图)
Petya and Graph http://codeforces.com/contest/1082/problem/G time limit per test 2 seconds memory li ...
- 图片添加热点MAP之后连接无效的解决方法
好些接触网店的同事都会遇到这个问题:就是明明给图片添加了热点超链接,但是点击图片就是没反应. 其实这个问题就是热点冲突,也就是说这个页面中至少有2个名称相同的热点导致热点冲突无法正确加载. 谷歌浏览器 ...
- python之socket运用之执行命令
服务端的代码 import socket import subprocess HOST = "127.0.0.1" PORT = 5001 ip_bind = (HOST,PORT ...
- [leetcode]426. Convert Binary Search Tree to Sorted Doubly Linked List二叉搜索树转有序双向链表
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers ...
- [leetcode]632. Smallest Range最小范围
You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...
- SpringMVC工作原理2(代码详解)
图1.流程图 1.当一个请求(request)过来,进入DispatcherServlet中,里面有个方法叫 doDispatch()方法 里面包含了核心流程 源码如下: 4.然后往下看getHand ...