第十五届蓝桥杯大赛软件赛国赛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;
}
相关推荐
IronMurphy1 天前
【算法四十三】279. 完全平方数
算法
墨染天姬1 天前
【AI】Hermes的GEPA算法
人工智能·算法
papership1 天前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826521 天前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u1 天前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
c++之路1 天前
C++信号处理
开发语言·c++·信号处理
_深海凉_1 天前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
故事还在继续吗1 天前
C++20关键特性
开发语言·c++·c++20
青少儿编程课堂1 天前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
旖-旎1 天前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历