首页 > 其他分享 >[ABC128D] equeue

[ABC128D] equeue

时间:2023-04-26 19:57:12浏览次数:43  
标签:fs 题目 int sum 负数 ABC128D equeue

2023-01-14

题目传送门

翻译

难度&重要性(1~10):

题目来源

AtCoder

题目算法

暴力,贪心

解题思路

由题意可以得出,数据只有 \(n \leq 50,k \leq 100\)。所以,可以使用暴力,枚举从左右两边取的个数(只能从两边取),用一个数组记录下负数,去玩两边之后,将负数排个序,再用剩下的步骤,每次将最小的负数放回原序列(正数不要丢!),直到步骤用完或者负数全部放回原序列。最后找出最大值即可。

完成状态

已完成

Code

#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int a[1000005];
int fs[10005],tot;//fs记录负数
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n-i;j++){//不能将全部取完
			if(i+j>m) continue;//不能超过步数
			int sum=0;//sum记录当前方案的值
			tot=0;
			for(int k=1;k<=i;k++){
				sum+=a[k];
				if(a[k]<0)
					fs[++tot]=a[k];//从左边取出i个数,并将负数加入到fs数组中
			}
			for(int k=n;k>=n-j+1;k--){
				sum+=a[k];
				if(a[k]<0)
					fs[++tot]=a[k];//从右边取出j个数,并将负数加入到fs数组中
			}
			sort(fs+1,fs+tot+1);//将负数排序,就可以从小到大将负数丢掉
			int s=m-i-j;
			for(int k=1;k<=tot;k++){//枚举负数
				if(s==0) break;//不能超过步骤
				s--;
				sum-=fs[k];//将最小的负数丢掉
			}
			ans=max(ans,sum);//求出最大值
		}
	}
	cout<<ans;
	return 0;
}

标签:fs,题目,int,sum,负数,ABC128D,equeue
From: https://www.cnblogs.com/OIerBoy/p/17357080.html

相关文章

  • 【Android】Message、Handler、MessageQueue、Looper 详解
    1前言​Handler即处理器,常用于跨线程通讯:线程A和线程B拥有同一个handler对象,在线程A中使用handler的sendMessage()方法发送消息,在线程B中使用handler......
  • 深入学习jquery源码之queue()与dequeue()
    深入学习jquery源码之queue()与dequeue()queue(element,[queueName])概述显示或操作在匹配元素上执行的函数队列参数element,[queueName] Element,Stringelement:检查附加......
  • 使用joinablequeue优化生产者消费者问题
    #Joinablequeue队列'''put存放get获取task_done计数器属性值-1join配合task_done使用,阻塞put一次数据,队列的内置计数器属性值+1get一次数据,通过task_done让......
  • windbg finalizequeue
    Pickafewandfindoutwheretheyarerooted(i.e.whytheycan’tbecollected)Note:Youmaywanttotryacoupledifferentones.!gcroot<addressofcha......
  • CLR GC FinalizeQueue 深入剖析
    引子最近开始看这个起因其实是在看项目代码时发现实现Disposable模式时,项目代码中感觉有些地方实现的没有这个必要,和同事讨论之后,无果,索性就又去研究了下CLRGC中关......