第十五届蓝桥杯大赛软件赛国赛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;
}
相关推荐
kisshyshy7 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
众少成多积小致巨8 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
猿人谷14 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络15 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络15 小时前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao40015 小时前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao40015 小时前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法