题目:修改后的和
链接: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;
}