第十五届蓝桥杯大赛软件赛国赛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;
}
相关推荐
Chester_19992 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
裕晟资质规划3 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
会周易的程序员4 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
小灰灰搞电子4 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化4 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
en.en..5 小时前
C语言 标准输入 / 输出缓冲区
算法
吃好睡好便好6 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球6 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
小灰灰搞电子7 小时前
C++ 引用折叠详解
c++
靠沿8 小时前
贪心算法专题(二)
算法·贪心算法