第十五届蓝桥杯大赛软件赛国赛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;
}
相关推荐
辛苦才能几秒前
C++多态原理:虚函数表的内存布局与动态绑定的汇编真相
开发语言·c++
西西弗Sisyphus10 分钟前
Qt 实现一个 水波进度球
c++·qt·c
无忧.芙桃11 分钟前
数据结构之排序算法(中):冒泡排序与快速排序,从相邻交换到工程级优化
c语言·c++·排序算法
不会就选b11 分钟前
算法日常・每日刷题--<贪心>17
算法
Hhy_110717 分钟前
《C++深度解构04》类和对象(下)——类型转换、static、友元与编译器优化
c语言·c++·学习·类和对象·visual studio
qq_1998868743 分钟前
第7板块·第1节:通用算子分类与设计模式
c++·人工智能·gpu算力·cuda
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
神仙别闹8 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
会周易的程序员8 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
有点。9 小时前
C++03阶段练习(练习题)
数据结构·算法·图论