自学内容网 自学内容网

1116蓝桥杯算法双周赛小白入门赛4.5.6题题解

本人是很普通的大学生,算法水平并不高,不能保证解答一定是最好的算法,如果有错误或者更好的算法欢迎评论区讨论

原题链接 第 22 场 小白入门赛 - 蓝桥云课

小白入门赛的4.5.6题也是强者挑战杯的1.2.3题

4.能量晶石【算法赛】 - 蓝桥云课

分析题目:

给一个数组,代表一群人,数字代表每个人的钱

每次选一个人去取钱,除了自己以外,给每个人带一块钱

问:能不能做到所有人的钱都一样

分析:

除了自己以外,给每个人带一块钱     ========>         自己少一块钱   ========>nums[pos]--

能不能做到所有人的钱都一样         ========>            数组元素都一样

解答:

本题不难,在把数据存到数组里面时找到最小值,然后遍历数组    ans +=  nums[pos] - 最小值

#include <iostream>
using namespace std;
int  nums[100005];
int main()
{
  int  n = 0; cin>>n;
  int minn = 100000;
  for(int i = 1;i <= n;i++) {cin>>nums[i];
    minn = min(nums[i],minn);
  }
  long long ret = 0;
  for(int i = 1;i <= n;i++)
  {
    ret += nums[i] - minn;
  }
  cout << ret <<endl;
  return 0;
}

5.缺失的环节【算法赛】 - 蓝桥云课

标签:

滑动窗口

分析题目:

给一个01字符串

找到一个数字,这个数字转成二进制后,不存在于这个字符串

问:数字最小是多少

分析:按转成二进制的长度来进行遍历,请注意小二进制字串必须以1开头,可以使用set类来去重,

#include <iostream>
#include <string>
#include <set>
using namespace std;
int fun(const std::string& str) {
    int ret = 0;
    for (char c : str) {
        ret *= 2;
        ret += (c - '0');
    }
    return ret;
}

int main()
{
    int size = 0;
    string str;
    cin >> size; cin >> str;
    int len = 1;
    while (len <= size) {
        int left = 0, right = len - 1;
        set<int> ss;
        int t = 1 << (len - 1);
        if (len == 1)  t++;
        for (; right < size; right++, left++) {
            if (len != 1 && str[left] == '0') continue;
            ss.insert(fun(str.substr(left, len)));
            // cout << str.substr(left, len) << ' ';
            if (ss.size() == t)
                break;
        }
        if (ss.size() < t)
        {
            int begin = 1 << (len - 1), end = 1 << len;
            if (len == 1) begin = 0;

            while (ss.count(begin)) {
                begin++;
            }
            cout << begin << endl;
            return 0;
        }
        len++;
    }
    return 0;
}

6.召唤帝皇侠【算法赛】 - 蓝桥云课

这是一道很恶心的数学题.......

我参考了这个人的题解

分析:

对于任意[n*n,(n+1)*(n+1))   里的元素来说,需要%n == 0 才符合题意

        分析这其中的元素

  1.         n*n < (n+1)*(n+1)   && (n+1)*(n+1) % n == 0
  2.         n*(n + 1) < (n+1)*(n+1)   && (n+1)*(n+1) % n == 0
  3.         n*(n + 2) < (n+1)*(n+1)   && (n+1)*(n+1) % n == 0

一个值最多有三个

和为n * (3n +3)

n 从 1 到  根号 X  也就是

n(n+1)(n+2)

#include <iostream>
#include <cmath>
using namespace std;
using ll = long long;
ll N = 998244353;
int main() {
    int t;  cin >> t;
    while (t--) {
        ll x;  cin >> x;
        ll n = (ll)sqrt(x + 1); // 取整
        ll ret = (n - 1) * n % N * (n + 1) % N;   // 前面完整的情况
        // 不完整情况
        int i = 0;
        while (n * (n + i) <= x)
            ret = (ret + n * (n + i++) ) % N;
        cout << ret << endl;
    }
}


原文地址:https://blog.csdn.net/l23456789mmmmm/article/details/143829576

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!