3.数学奇才【算法赛】 - 蓝桥云课 (lanqiao.cn)
这是我的代码,过了样例: 我的想法是首先遇到了负数就cnt++,往后一直遇到负数就一直cnt++,直到遇到一个正数那么就把cnt加到vector里面,cnt清0。就这样重复,最后vector里面存的就是每一段负数区间的个数,我找出最大的那段区间,将其全部乘-1变为正数,这样得到的值就是最大值:
#include<iostream>
#include<vector>
using namespace std;
typedef long long LL;
const int N = 1e9 + 5;
LL sum = 0;
vector<LL> temp;
int cnt = 0;
int flag = 0;
int max_n = -1;
int a[100000005];
int main() {
int n; cin >> n;
for (int i = 0; i <n; i++)cin >> a[i];
for (int i = 0; i < n; i++) {
if (a[i] < 0) {
cnt++;
}
else if (a[i] > 0) {
temp.push_back(cnt);
cnt = 0;
}
}
if (temp.size() > 0) { // 确保 temp 不为空
int index = 0;
for (int i = 0; i < temp.size(); i++) {
if (temp[i] > max_n) {
max_n = temp[i];
}
}
for (int i = 0; i < max_n; i++)
{
a[i] *= -1;
}
for (auto& it :a)sum += it;
}
cout << sum << endl;
return 0;
}
这是人家的代码:
其实就是想复杂了,题目说了不能超过n次操作,也就是最多操作,可以自己写一些例子看看,不能怎么操作都是可以在n次操作内把所有的负数都变为正数的。
因此我们只需要加上所有数的绝对值就可以了。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int i;
long long count=0,num[100001];
for(i=0;i<n;i++)
{
cin>>num[i];
count+=abs(num[i]);
}
cout<<count;
return 0;
}