蓝桥杯题目-最大数组和

链接

最大数组和 - 蓝桥云课 (lanqiao.cn)

知识点

前缀和,枚举

思路

       首先,我们想到了一种贪心的解法,每次删除价值和更小的两个宝石或者删除价值最大的宝石,根据哪种操作可以删除价值更小的宝石。然而,这种方法甚至在示例上都不适用,我们需要更优的解法。

        注意到操作的顺序并不重要:删除两个最小的宝石然后再删除最大的宝石与先删除最大的宝石然后再删除两个最小的宝石的操作是相同的。因此,我们可以假设删除了最大宝石的操作次数为m,当我们删除最大宝石时,剩下的宝右组成的数组就是从中删除了2m个最小宝石和(k一m)个最大宝石的宝石数组。
        然后,对原始数组进行排序不会影响结果,因为最小宝石始终在数组的开头,最大宝石则在数组的末尾。也就是排序后,每次操作要么删除左边的两个元素,要么删除右边的一个元素。因此,如果我们删除2m个最小宝石和(k一m)个最大宝石,则剩余的元素组成的段在排序后的数组中从位置(2m+1)到位置(n-(k-m)),可以从左到石遍历m,使用前缀和计算其总和。

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long; 

const int N = 2e5+10;

ll a[N],prefix[N]; 

int main(){
	int t;
	cin>>t;
	while(t--){
		int n,k;
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		sort(a+1,a+n+1);
		for(int i=1;i<=n;i++){
			prefix[i] = prefix[i-1] + a[i];
		}
		ll ans = 0;
		int pos = 0;
		while(k>=0){
			ans = max(ans,prefix[n-k] - prefix[pos]); 
			pos += 2;
			k--;
		}
		cout<<ans<<endl;
	}
	return 0;
} 
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2018年蓝桥杯java题目是基于ACM国际大学生程序设计竞赛的题目,考察参赛选手在算法和编程方面的能力。 题目中提供了一个数据集,包含了n个字符串,每个字符串只由小写字母和数字组成。选手需要实现一个程序,对输入的数据进行处理并输出结果。 具体要求如下: 1. 对输入的数据进行预处理,对于每个字符串,将其中的字母全部转换为大写字母,将数字删去,同时删除字符串中重复的字符。 2. 将处理后的字符串按照字典序从小到大排序,并输出每个字符串的长度。 3. 输出排序后的结果。 选手需要使用java语言编写程序,并在规定的时间内完成。 解题思路如下: 1. 读取输入数据,并创建一个字符集合来存储处理后的字符串。 2. 对于每个输入字符串,遍历每个字符,如果是字母,则转换为大写字母,如果是数字,则删除。 3. 将处理后的字符串加入字符集合中,利用set集合的特性来删除重复字符。 4. 将字符集合转换为数组,并利用Arrays.sort()方法按照字典序排序。 5. 遍历排序后的数组,输出每个字符串的长度和字符串本身。 通过以上步骤,我们可以得到预处理后的字符串集合,并按照要求进行排序和输出。 总结来说,2018年蓝桥杯java题目主要考察选手对于字符串处理、集合的使用和排序算法的掌握。选手需要通过编写java程序实现对输入数据的处理和输出结果,从而解答题目要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值