第十五届蓝桥杯大赛软件赛国赛C/C++大学B组

目录

一.合法密码

1.题目讲解

2.代码实现

二.选数概率

1.题目讲解

2.代码实现

三.蚂蚁开会

1.题目讲解

2.代码实现

四.立定跳远

1.题目讲解

2.代码实现

五.最小字符串

1.题目讲解

2.代码实现

六.数位翻转

1.题目讲解

2.代码实现

七.数星星

1.题目讲解

2.代码实现

八.套手镯

1.题目讲解

2.代码实现

九.跳石头

1.题目讲解

2.代码实现

十.最长回文前后缀

1.题目讲解

2.代码实现


制作不易,求求点赞加关注

一.合法密码

题目链接:https://www.lanqiao.cn/problems/20124/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;

string s = "kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th";

bool check(int l,int r)
{
    int a = 0,b = 0;
    for(int i = l;i <= r;i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            a++;
        }
        else if(s[i] >= 'a' && s[i] <= 'z')
        {
            
        }
        else
        {
            b++;
        }
    }
    return a >= 1 && b >= 1;
}

int main()
{
    int n = s.size();
    int ans = 0;
    for(int len = 8;len <= 16;len++)
    {
        for(int i = 0;i + len - 1 < n;i++)
        {
            if(check(i,i + len - 1))
            {
                ans++;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

最终答案是400 (可以直接输出)

二.选数概率

题目链接:https://www.lanqiao.cn/problems/20157/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;


int main()
{
    cout << "55,94,56";    
    return 0;
}

三.蚂蚁开会

题目链接:https://www.lanqiao.cn/problems/20133/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <map>

using namespace std;

typedef pair<int,int> PII;
int n,ret,x1,y1,x2,y2;
map<PII,int> mp;

int gcd(int a,int b)
{
    return b == 0 ? a : gcd(b,a % b);
}

void calc()
{
    int dx = x2 - x1,dy = y2 - y1;
    int d = gcd(abs(dx),abs(dy));
    dx /= d;
    dy /= d;
    for(int i = x1,j = y1;;i += dx,j += dy)
    {
        mp[{i,j}]++;
        if(mp[{i,j}] == 2)
        {
            ret++;
        }
        if(i == x2 && j == y2)
        {
            break;
        }
    }
}

int main()
{
    cin >> n;
    for(int i = 1;i <= n;i++)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        calc();
    }
    cout << ret << endl;
    return 0;
}

四.立定跳远

题目链接:https://www.lanqiao.cn/problems/20132/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 1e5 + 10;
int n,m,a[N];

bool check(int x)
{
    int sum = 0;
    for(int i = 1;i <= n;i++)
    {
        sum += (a[i] - a[i - 1] - 1) / x;
    }
    return sum <= m + 1;
}

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        cin >> a[i];
    }
    int l = 1,r = 1e8;
    while(l < r)
    {
        int mid = (l + r) / 2;
        if(check(mid))
        {
            r = mid;
        }
        else
        {
            l = mid + 1;
        }
    }
    cout << l << endl;
    return 0;
}

五.最小字符串

题目链接:https://www.lanqiao.cn/problems/20167/learning/

1.题目讲解

一个简单的模拟题目

2.代码实现

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;

int n,m;
string s,t;

int main()
{
    cin >> n >> m;
    cin >> s >> t;
    sort(t.begin(),t.end());
    string ans;
    int cur1 = 0,cur2 = 0;
    while(cur1 < n && cur2 < m)
    {
        if(s[cur1] <= t[cur2])
        {
            ans += s[cur1];
            cur1++;
        }
        else
        {
            ans += t[cur2];
            cur2++;
        }
    }
    while(cur1 < n)
    {
        ans += s[cur1];
        cur1++;
    }
    while(cur2 < m)
    {
        ans += t[cur2];
        cur2++;
    }
    cout << ans << endl;
    return 0;
}

六.数位翻转

题目链接:https://www.lanqiao.cn/problems/20145/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;

typedef long long LL;
const int N = 1010;
LL n,m,a[N],b[N];
LL f[N][N],g[N][N];

LL calc(LL x)
{
    LL ret = 0;
    while(x)
    {
        ret = ret * 2 + x % 2;
        x /= 2;
    }
    return ret;
}

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        cin >> a[i];
        b[i] = calc(a[i]);
    }
    
    for(int i = 1;i <= n;i++)
    {
        f[i][0] = f[i - 1][0] + a[i];
        for(int j = 1;j <= m;j++)
        {
            f[i][j] = max(f[i - 1][j],g[i - 1][j]) + a[i];
            g[i][j] = max(f[i - 1][j - 1],g[i - 1][j]) + b[i];
        }
    }
    LL ret = 0;
    for(int j = 0;j <= m;j++)
    {
        ret = max(ret,max(f[n][j],g[n][j]));
    }
    cout << ret << endl;
    return 0;
}

七.数星星

题目链接:https://www.lanqiao.cn/problems/20261/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <cstring>
using namespace std;

typedef long long LL;
const int N = 1e5 + 10,MOD = 1e9 + 7;
LL n,d[N],L,R;
LL f[N],g[N];
LL mp[N];

LL qpow(LL a,LL b)
{
    LL ret = 1;
    while(b)
    {
        if(b & 1)
        {
            ret = ret * a % MOD;
        }
        a = a * a % MOD;
        b >>= 1;
    }
    return ret;
}

void init()
{
    f[0] = 1;
    for(int i = 1;i <= n;i++)
    {
        f[i] = f[i - 1] * i % MOD;
    }
    g[n] = qpow(f[n],MOD - 2);
    for(int i = n - 1;i >= 0;i--)
    {
        g[i] = g[i + 1] * (i + 1) % MOD;
    }
}

LL C(int n,int m)
{
    if(m > n)
    {
        return 0;
    }
    return f[n] * g[m] % MOD * g[n - m] % MOD;
}

LL calc(int x)
{
    if(mp[x] != -1)
    {
        return mp[x];
    }
    LL sum = 0;
    for(int i = L - 1;i <= R - 1;i++)
    {
        sum = (sum + C(x,i)) % MOD;
    }
    return mp[x] = sum;
}

int main()
{
    cin >> n;
    for(int i = 1;i < n;i++)
    {
        int a,b;
        cin >> a >> b;
        d[a]++;
        d[b]++;
    }
    cin >> L >> R;
    init();
    memset(mp,-1,sizeof(mp));
    LL ret = 0;
    for(int i = 1;i <= n;i++)
    {
        ret = (ret + calc(d[i])) % MOD;
    }
    if(L <= 2 && 2 <= R)
    {
        ret = ((ret - n + 1) % MOD + MOD) % MOD;
    }
    cout << ret << endl;
    return 0;
}

八.套手镯

题目链接:https://www.lanqiao.cn/problems/20148/learning/

1.题目讲解

总的时间复杂度是O(n * n * logN)

2.代码实现

cpp 复制代码
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 1010;
int n,w,h,ret;
struct node
{
    int u,d,l,r;
}a[N];

bool cmp(node& a,node& b)
{
    return a.u < b.u;
}

void solve()
{
    for(int i = 1;i <= n;i++)
    {
        int L = a[i].l,R = a[i].l + w;
        priority_queue<int,vector<int>,greater<int>> heap;
        for(int j = 1;j <= n;j++)
        {
            if(a[j].l < L || a[j].r > R)
            {
                continue;
            }
            heap.push(a[j].d);
            while(heap.size() && heap.top() < a[j].u - h)
            {
                heap.pop();
            }
            ret = max(ret,(int)heap.size());
        }
    }
    
}

int main()
{
    cin >> n >> w >> h;
    for(int i = 1;i <= n;i++)
    {
        int x,y,r;
        cin >> x >> y >> r;
        a[i] = {y + r,y - r,x - r,x + r};
    }
    sort(a + 1,a + n + 1,cmp);

    solve();
    swap(w,h);
    solve();
    cout << ret << endl;
    return 0;
}

九.跳石头

题目链接:https://www.lanqiao.cn/problems/20151/learning/

1.题目讲解

我们采用位图进行优化

2.代码实现

cpp 复制代码
#include <iostream>
#include <bitset>
using namespace std;

const int N = 4e4 + 10;
int n,c[N];
bitset<N> f[N];

int main()
{
    cin >> n;
    for(int i = 1;i <= n;i++)
    {
        cin >> c[i];
    }
    int ret = 0;
    for(int i = n;i >= 1;i--)
    {
        f[i][c[i]] = 1;
        if(i + i <= n)
        {
            f[i] |= f[i + i];
        }
        if(i + c[i] <= n)
        {
            f[i] |= f[i + c[i]];
        }
        ret = max(ret,(int)f[i].count());
    }
    cout << ret << endl;
    return 0;
}

十.最长回文前后缀

题目链接:https://www.lanqiao.cn/problems/20169/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1e6 + 10;
int pi[N];

int kmp(string& a,string& b)
{
    string s = " " + a + "#" + b;
    int n = a.size(),ret = 0;
    for(int i = 2,j = 0;i <= n + n + 1;i++)
    {
        while(j && s[i] != s[j + 1])
        {
            j = pi[j];
        }
        if(s[i] == s[j + 1])
        {
            j++;
        }
        pi[i] = j;
        if(i > n && i < n + n + 2 - pi[i])
        {
            ret = max(ret,pi[i]);
        }
    }
    return ret;
}

int main()
{
    string s;
    cin >> s;
    int l = 0,r = s.size() - 1;
    while(l < r)
    {
        if(s[l] != s[r])
        {
            break;
        }
        l++;
        r--;
    }
    string a = s.substr(l,r - l + 1);
    string b = a;
    reverse(b.begin(),b.end());
    cout << l + max(kmp(a,b),kmp(b,a)) << endl;

    return 0;
}
相关推荐
fpcc11 小时前
c++编程实践—堆和栈越界调试
c++
yi01111 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
weiabc12 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦14 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下14 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J14 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛14 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有15 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111115 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS15 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密