蓝桥杯小白赛第六期 3.数学奇才 知识点:打表

425 阅读1分钟

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;
}

image.png

image.png 这是人家的代码: 其实就是想复杂了,题目说了不能超过n次操作,也就是最多操作,可以自己写一些例子看看,不能怎么操作都是可以在n次操作内把所有的负数都变为正数的。

因此我们只需要加上所有数的绝对值就可以了。

image.png

#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;
}

image.png