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 才符合题意
分析这其中的元素
- n*n < (n+1)*(n+1) && (n+1)*(n+1) % n == 0
- n*(n + 1) < (n+1)*(n+1) && (n+1)*(n+1) % n == 0
- 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)!