修改后的和

该文章描述了一种编程问题的解决方案,涉及处理整数数组,通过存储正数元素的乘积(n-i个)来计算可能的减法操作,并对这些值进行降序排序。在m次操作中,从最大值开始减去以达到最小总和。代码示例展示了如何实现这一逻辑。
摘要由CSDN通过智能技术生成

 题目:修改后的和

链接:https://ac.nowcoder.com/acm/contest/59284/D

①首先,最好开long long 怕爆掉啥的

②其次输入a[i],根据题意可知当a[i]>0的时候,就有可能被选取减啥的,所以这个地方可以判断当a[i]>0的时候,就把要减去的总和用一个数组是s存起来(总和=数值✖个数),数值即为a[i],个数为n-i个(因为是从i到n的数,减去a[i])

③并记录好所以a[i]的总和sum

④利用sort排序,将s数组从大到小排序(因为题目是要求最小的和,因此减去的要最大的才好

⑤进入m次操作,但是这个地方还要有个地方注意,就是s里面的个数可能比m小,因此就不需要操作m次,只要操作s.size()次,因此循环条件应该是i < m && i < s.size()

⑥根据循环,拿总和sum去减s[i],经过有限次操作后,就能得到我们所需要的选取减去得到的最小的总和啦~~

#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve()
{
	int n,m;
	cin>>n>>m;
	ll sum = 0;
	vector<ll> a(n+1);
	vector<ll>s;
	for (int i = 0; i < n; i++) 
	{
		cin >> a[i];
		if (a[i] >= 0 ) 
		{ 
			s.push_back(a[i] * (n - i));//因为是第k到n,因此就是i-n,所以有n-i个
		}
		sum +=a[i];//求总和
	}
	sort(s.begin(),s.end(), greater<ll>());//从大到小排序(要减去的和)
	for (int i = 0; i < m && i < s.size(); i++) //判断的条件要加上i < s.size(),因为有可能s里面没有m个数啥的
		sum -= s[i];//每次去减
	cout << sum << endl;
}
int main()
{
	int T;
	cin>>T;
	while(T--) 
	{
		solve();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值