2021牛客寒假算法基础集训营3【解题报告】

VMmare 虚拟机“无权输入许可证密钥...”与 hadoop 集群 无法 启动 vwmare 出现 提示 无权 密钥 解决 环境 启动失败 编辑 网络 配置 1、“您无权输入许可证密钥,请使用系统管理员帐户重试 ”问题与解决方法 2、导入Hadoop文件后,hadoop集群无法成功启动问题与解决方法 VMmare 虚拟机“无权输入许可证密钥...”与 hadoop 集群 无法 启动 vwmare 出现 提示 无权 密钥 解决 环境 启动失败 编辑 网络 配置 1 2 5 6 7 8 9 0 阅读详情

A 模数的世界

题目描述

牛牛非常喜欢模数的世界。有一天他想到了一个问题:如果已知 x ≡ a    ( m o d    p ) \mathit x\equiv a \; (mod \; p) x≡a(modp) , y ≡ b    ( m o d    p ) \mathit y\equiv b \; (mod \; p) y≡b(modp), 那么 g c d ( x , y )    m o d    p \mathit gcd(x, y) \; \mathit mod \; \mathit p gcd(x,y)modp 最大是多少呢? 此时的 x \mathit x x 和 y \mathit y y 又可以怎么取值呢?
稍加思索后,牛牛找到了自己的答案,可惜这个地方太小,写不下。
聪明的你们可以写一个程序,帮帮牛牛算出这个问题的答案吗?
注意你取的 x \mathit x x 和 y \mathit y y 必须在 [ 0 , 2 63 − 1 ] \text [0,2^{63}-1] [0,263−1] 范围以内。
g c d ( x , y ) \mathit gcd(x, y) gcd(x,y) 指 x \mathit x x 和 y \mathit y y 的最大公约数。
g c d ( x , 0 ) = x \mathit gcd(x, 0) =x gcd(x,0)=x , g c d ( 0 , 0 ) = 0 \mathit gcd(0,0)=0 gcd(0,0)=0

输入描述:

第一行为一个整数 T \mathit T T,代表测试组数
接下来 T \mathit T T 行,每行都是以空格分隔的三个整数 a , b , p \mathit a,b,p a,b,p, 其中。
1 ≤ T ≤ 1 0 6 1\leq T \leq 10^{6} 1≤T≤106
0 ≤ a , b < p ≤ 2 × 1 0 4 0\leq a,b < p \leq 2×10^{4} 0≤a,b<p≤2×104
题目保证 p \mathit p p 是素数

输出描述:

输出 T \mathit T T 行,每行以空格分隔的三个非负整数 g , x , y \mathit g,x,y g,x,y,分别表示 g c d ( x , y )    m o d    p \mathit gcd(x, y)\;mod\;p gcd(x,y)modp 的最大值 x \mathit x x, y \mathit y y,解不唯一,任何满足题意的解都被认为是正确的答案。

分析:

打表可以发现
若 a , b a,b a,b 同时为 0 0 0,则最大值为 0,此时 x , y x,y x,y 可以直接取 0 , 0 0, 0 0,0.
否则,最大值为 p − 1 p - 1 p−1.

因此下面只需要讨论当 a , b a, b a,b 不同时为 0 0 0 时, x , y x, y x,y 该如何取值.

令 x = ( p − 1 ) ( k 1 p − a ) ,    y = ( p − 1 ) ( k 2 p − b ) x = (p - 1)(k_1p - a), \; y = (p - 1)(k_2p - b) x=(p−1)(k1​p−a),y=(p−1)(k2​p−b).

因此 x ≡ a    ( m o d    p ) ,    y ≡ b    ( m o d    p ) ,    g c d ( x , y ) = ( p − 1 ) g c d ( k 1 p − a , k 2 p − b ) x \equiv a\; (mod \; p), \; y \equiv b \; (mod \; p), \; gcd(x, y) = (p - 1)gcd(k_1p - a, k_2p - b) x≡a(modp),y≡b(modp),gcd(x,y)=(p−1)gcd(k1​p−a,k2​p−b).

因此只需要找到一组 k 1 , k 2 k_1,k_2 k1​,k2​ 满足 g c d ( k 1 p − a , k 2 p − b ) = 1 gcd(k_1p - a, k_2p - b) = 1 gcd(k1​p−a,k2​p−b)=1 即可.

由于笔者太菜了,这里采用了暴力枚举的方法,嘤嘤嘤

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;

const int M = (int)1e5;
const int N = (int)5e2;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

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

void work()
{
    int a, b, p; scanf("%d %d %d", &a, &b, &p);
    if(a == 0 && b == 0) {printf("0 0 0\n"); return;}
    for(int k1 = 1; k1 <= 10; ++k1)
    {
        for(int k2 = 1; k2 <= 10; ++k2)
        {
            int x = (k1 * p - a) * (p - 1), y = (k2 * p - b) * (p - 1);
            if(gcd(x, y) == p - 1)
            {
                printf("%d %d %d\n", p - 1, x, y);
                return;
            }
        }
    }
    assert(0);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int T; scanf("%d", &T);
    while(T--) work();
//    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

B 内卷

题目描述

在一个班级里有 n \mathit n n 个同学,在这个即将进行数据结构期末考试的关头,为了减少内卷,他们决定聚在一起商量对策。
每个人在考试后会得到一个 A , B , C , D , E \mathit A,B,C,D,E A,B,C,D,E 的等级和一个分数,学校要求得到等级 A \mathit A A 的人不超过 k \mathit k k 个。
已知第 i \mathit i i 个同学在得到五个等级时预期的分数分别为 a i , b i , c i , d i , e i a_{i},b_{i},c_{i},d_{i},e_{i} ai​,bi​,ci​,di​,ei​ 。
请问在最理想的情况且不违反上述条件的情况下,他们的预期分数最大值和最小值之差最小为多少。

输入描述:

第一行以空格分隔的两个正整数 n , k \mathit n,k n,k。
接下来 n \mathit n n 行每行五个以空格分隔的正整数 a i , b i , c i , d i , e i a_{i},b_{i},c_{i},d_{i},e_{i} ai​,bi​,ci​,di​,ei​。

1 ≤ k ≤ n ≤ 1 0 5 1\leq k \leq n \leq 10^{5} 1≤k≤n≤105
1 ≤ e i ≤ d i ≤ c i ≤ b i ≤ a i ≤ 1 0 9 1\leq e_{i} \leq d_{i} \leq c_{i} \leq b_{i} \leq a_{i} \leq 10^{9} 1≤ei​≤di​≤ci​≤bi​≤ai​≤109

输出描述:

输出一行一个正整数代表答案。

分析:

赛中模拟退火到上火…

把 5 n 5n 5n 个三元组 ( v a l , i s A , i d ) (val, isA, id) (val,isA,id) 按照 v a l val val 从小到大排序,之后尺取即可(确实很妙).

详见代码.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;

const int M = (int)1e5;
const int N = (int)5e2;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int n, k, m;

struct node
{
    int val, isA, id;
    node(int _val = 0, int _isA = 0, int _id = 0): val(_val), isA(_isA), id(_id){}
    bool operator<(const node& b)const
    {
        return val < b.val;
    }
}s[M * 5 + 5];

int idCnt, aCnt;
int idVis[M + 5], aVis[M + 5];

inline bool check()
{
    return idCnt == n && aCnt <= k;
}

void add(int p)
{
    if(s[p].isA)
    {
        if(!idVis[s[p].id]) ++aCnt;
        ++aVis[s[p].id];
    }
    if(++idVis[s[p].id] == 1) ++idCnt;
}

void del(int p)
{
    if(--idVis[s[p].id] == 0) --idCnt;
    if(s[p].isA)                                  --aVis[s[p].id], --aCnt;
    else if(aVis[s[p].id] && idVis[s[p].id] == 1) ++aCnt;
}

void work()
{
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1, a; j <= 5; ++j)
        {
            scanf("%d", &a);
            s[++m] = node(a, j == 1, i);
        }
    }
    sort(s + 1, s + m + 1);
    int mi = inf;
    for(int l = 1, r = 0; l <= m; ++l)
    {
        while(r < m && !check()) add(++r);
        if(check()) mi = min(mi, s[r].val - s[l].val);
        del(l);
    }
    printf("%d\n", mi);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

C 重力坠击

题目描述

在一个二维平面上有 n \mathit n n 个敌人,第 i \mathit i i 个敌人可以描述为一个以 ( x i , y i ) (x_{i},y_{i}) (xi​,yi​) 为圆心, r i r_{i} ri​为半径的圆。
你每次可以对一个半径为 R \mathit R R 的圆范围内进行攻击(圆心自选,但圆心的横纵坐标必须为整数),对于与你攻击范围有交点的敌人都会被消灭。
你总共可以发动 k \mathit k k 次攻击,问最多能消灭多少敌人。

输入描述:

第一行以空格分隔的三个整数 n , k , R \mathit n,k,R n,k,R。
接下来 n \mathit n n 行每行以空格分隔的三个整数 x i , y i , r i x_{i},y_{i},r_{i} xi​,yi​,ri​。

1 ≤ n ≤ 10 1\leq n \leq 10 1≤n≤10
1 ≤ k ≤ 3 1\leq k \leq 3 1≤k≤3
1 ≤ r i , R ≤ 7 1\leq r_{i},R \leq 7 1≤ri​,R≤7
0 ≤ ∣ x i ∣ , ∣ y i ∣ ≤ 7 0\leq |x_{i}|,|y_{i}| \leq 7 0≤∣xi​∣,∣yi​∣≤7
敌人的位置可能会有重叠。

输出描述:

输出一行一个正整数代表答案。

分析:

显然,圆心选在 { ( x , y ) ∣ − 7 ≤ x , y ≤ 7 , x ∈ Z , y ∈ Z } \{(x, y)| -7 \leq x, y \leq 7,x \in Z, y \in Z \} {(x,y)∣−7≤x,y≤7,x∈Z,y∈Z} 一定是最优的.
因此只需要暴力枚举圆心所在位置,更新最大值即可.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e5;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int n, k, R;
int x[20], y[20], r[20];
int X[20], Y[20];
bool vis[20];
int ans = 0;

bool xiangjiao(int i, int j)
{
    int dx = X[i] - x[j], dy = Y[i] - y[j];
    int dis2 = dx * dx + dy * dy;
    return dis2 <= (R + r[j]) * (R + r[j]);
}

void cal()
{
    memset(vis, 0, sizeof(vis));
    for(int i = 1; i <= k; ++i)
    {
//        printf("X[%d] = %d Y[%d] = %d\n", i, X[i], i, Y[i]);
        for(int j = 1; j <= n; ++j)
        {
            if(vis[j]) continue;
            if(xiangjiao(i, j)) vis[j] = 1;
        }
    }
//    printf("------- end -------\n");
    int c = 0;
    for(int i = 1; i <= n; ++i) if(vis[i]) ++c;
    ans = max(ans, c);
}

void dfs(int u, int ck)
{
    if(k - ck > 225 - u) return;
    if(u == 225)
    {
        cal();
        return;
    }
    int x = u % 15 - 7, y = u / 15 - 7;
    dfs(u + 1, ck);
    if(ck < k)
    {
        X[ck + 1] = x, Y[ck + 1] = y;
        dfs(u + 1, ck + 1);
    }
}

void work()
{
    scanf("%d %d %d", &n, &k, &R);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d %d %d", &x[i], &y[i], &r[i]);
    }
    dfs(0, 0);
    printf("%d\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

D Happy New Year!

题目描述

还有一个周就要过年啦!这一天牛牛盯着新的台历出神,他突然想知道对于第 n \mathit n n 年来说,大于 n \mathit n n 且与 n \mathit n n 的数位和相同的最小年份是多少。
一个数字的数位和等于他各数位上的数字之和,例如 2 0212021 \text 20212021 20212021的数位和等于 2 + 0 + 2 + 1 = 52 + 0 + 2 + 1 = 5 \text 2+0+2+1=52+0+2+1=5 2+0+2+1=52+0+2+1=5。

输入描述:

一个正整数 n \mathit n n。

2021 ≤ n ≤ 2030 2021\leq n \leq 2030 2021≤n≤2030

输出描述:

输出一个正整数代表答案。

分析:

暴力.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e5;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int cal(int n)
{
    int s = 0;
    while(n)
    {
        s += n % 10;
        n /= 10;
    }
    return s;
}

void work()
{
    int n; scanf("%d", &n);
    for(int i = n + 1; ; ++i)
    {
        if(cal(i) == cal(n))
        {
            printf("%d\n", i);
            return;
        }
    }
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

E 买礼物

题目描述

在卖礼物的超市中有 n \mathit n n 个柜子,每个柜子里都摆放了一个礼物,每个礼物有自己的一个编号,第 i \mathit i i 个柜子里的礼物编号为 a i a_{i} ai​ 。
茶山牛想给牛牛和牛妹买相同编号的礼物,但礼物有可能在某个时刻被其他人买走,而且柜子数量太多,因此茶山牛在某个时刻只想知道某一个柜子区间是否能买到两件相同编号的礼物。
具体来说,有 q \mathit q q 次操作,格式如下:

1 \text 1 1 x \mathit x x,第 x \mathit x x个柜子里的礼物被买走,保证此时这个柜子里的礼物还在。

2 \text 2 2 l \mathit l l r \mathit r r,茶山牛询问第 l \mathit l l 到第 r \mathit r r 个柜子未被买走的礼物中是否有两个礼物编号相同。

输入描述:

第一行以空格分隔的两个正整数 n , q \mathit n,q n,q。
接下来一行以空格分隔的 n \mathit n n 个正整数 a i a_{i} ai​ 。
接下来 q \mathit q q 行每行一个操作。

1 ≤ n , q ≤ 5 × 1 0 5 1\leq n,q \leq 5×10^{5} 1≤n,q≤5×105
1 ≤ a i ≤ 1 0 6 1\leq a_{i} \leq 10^{6} 1≤ai​≤106
1 ≤ x , l ≤ r ≤ n 1\leq x,l \leq r \leq n 1≤x,l≤r≤n

输出描述:

对每次茶山牛的询问输出一行一个整数,如果在指定的区间内有两个礼物编号相同则输出 1 \text 1 1,否则输出 0 \text 0 0。

分析:

记 p r e [ i ] = m a x j ,    1 ≤ j < i ( a [ j ] = = a [ i ] ) pre[i] = \underset{j, \; 1\leq j < i}{max}(a[j] == a[i]) pre[i]=j,1≤j<imax​(a[j]==a[i])

对于操作2, [ l , r ] [l, r] [l,r] 中存在相同的数就等价于 m a x l ≤ i ≤ r ( p r e [ i ] ) ≥ l \underset{l \leq i \leq r}{max}(pre[i]) \geq l l≤i≤rmax​(pre[i])≥l.

对于操作1,用链表维护即可.

最后套上个线段树维护 p r e [ ] pre[] pre[] 的最大值.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e6;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int n, q, a[M + 5];
int pre[M + 5];
int suf[M + 5];
int last[M + 5];
int nx[M + 5];
int tree[M * 4 + 5];

inline int lc(int k) {return k<<1;}
inline int rc(int k) {return k<<1|1;}

void push_up(int k)
{
    tree[k] = max(tree[lc(k)], tree[rc(k)]);
}

void build(int k, int l, int r)
{
    if(l == r)
    {
        tree[k] = pre[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(lc(k), l, mid);
    build(rc(k), mid + 1, r);
    push_up(k);
}

void update(int k, int l, int r, int a, int b)
{
    if(l == r)
    {
        tree[k] = b;
        return;
    }
    int mid = (l + r) >> 1;
    if(a <= mid) update(lc(k), l, mid, a, b);
    else         update(rc(k), mid + 1, r, a, b);
    push_up(k);
}

int query(int k, int l, int r, int a, int b)
{
    if(l >= a && r <= b) return tree[k];
    int mx = 0, mid = (l + r) >> 1;
    if(a <= mid) mx = max(mx, query(lc(k), l, mid, a, b));
    if(mid < b)  mx = max(mx, query(rc(k), mid + 1, r, a, b));
    return mx;
}

void work()
{
    scanf("%d %d", &n, &q);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
        pre[i] = last[a[i]];
        last[a[i]] = i;
    }
    for(int i = n; i >= 1; --i)
    {
        if(nx[a[i]]) suf[i] = nx[a[i]];
        else         suf[i] = n + 1;
        nx[a[i]] = i;
    }
    build(1, 1, n);
    int op, x, l, r;
    for(int i = 1; i <= q; ++i)
    {
        scanf("%d", &op);
        if(op == 1)
        {
            scanf("%d", &x);
            update(1, 1, n, x, 0);
            if(suf[x] == n + 1) continue;
            suf[pre[x]] = suf[x];
            pre[suf[x]] = pre[x];
            update(1, 1, n, suf[x], pre[x]);
        }
        else if(op == 2)
        {
            scanf("%d %d", &l, &r);
            printf("%d\n", query(1, 1, n, l, r) >= l);
        }
    }
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

F 匹配串

题目描述

一个模式串指仅包含小写英文字母和至少一个’#‘的字符串,其中’#‘可以匹配一段任意长度的任意小写字母字符串。
一个匹配串指待匹配的只包含小写字母的字符串。
一个模式串和一个匹配串相匹配当且仅当把模式串里面的’#'全部分别替换成空或一段小写字母字符串后,两个串完全相同。
现在给出 n \mathit n n 个模式串,问有多少不同的匹配串与这些模式串全部相匹配。
如果答案有无穷多个,输出 - 1 \text -1 -1。

输入描述:

第一行一个正整数 n \mathit n n。
接下来 n \mathit n n 行每行一个只包含小写字母和’#‘的模式串。
1 ≤ n ≤ 1 0 6 1\leq n \leq 10^{6} 1≤n≤106
保证输入模式串的长度总和不超过 1 0 6 10^{6} 106 且每个模式串至少包含一个’#’

输出描述:

一行一个整数代表答案。
如果答案有无穷多个,输出 - 1 \text -1 -1。

分析:

CodeJam 原题???
把最短的含有 # 的前缀求出来,把最短的含有 # 的后缀求出来.
然后比较 n n n 个前缀能否相容, n n n 个后缀能否相容.
最后答案一定是非 0 0 0 即 1 1 1 的.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e6;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int n;
string s[M + 5];
string pre[M + 5];
string suf[M + 5];

void getPre()
{
    for(int i = 1; i <= n; ++i)
    {
        int p = 0;
        while(s[i][p] != '#') ++p;
        pre[i] = s[i].substr(0, p);
    }
}

void getSuf()
{
    for(int i = 1; i <= n; ++i)
    {
        int p = s[i].size() - 1;
        while(s[i][p] != '#') --p;
        suf[i] = s[i].substr(p + 1);
    }
}

bool cmp(const string& a, const string& b)
{
    return a.size() < b.size();
}

bool comPre(const string& a, const string& b)
{
    if(a.empty() || b.empty()) return 1;
    int n = a.size(), m = b.size();
    for(int i = 0; i < n; ++i)
    {
        if(a[i] != b[i]) return 0;
    }
    return 1;
}

bool comSuf(const string& a, const string& b)
{
    if(a.empty() || b.empty()) return 1;
    int n = a.size(), m = b.size();
    for(int i = n - 1; i >= 0; --i)
    {
        if(a[i] != b[m - n + i]) return 0;
    }
    return 1;
}

/**
2
a#efb
ac#defb
**/

bool check()
{
    for(int i = 1; i < n; ++i)
    {
        if(!comPre(pre[i], pre[i + 1])
           || !comSuf(suf[i], suf[i + 1])) return 0;
    }
    return 1;
}

void work()
{
    cin >> n;
    for(int i = 1; i <= n; ++i) cin >> s[i];
    getPre(); getSuf();
    sort(pre + 1, pre + n + 1, cmp);
    sort(suf + 1, suf + n + 1, cmp);

//    for(int i = 1; i <= n; ++i)
//    {
//        cout << "pre = " << pre[i] << " suf = " << suf[i] << "\n";
//    }

    cout << (check() ? -1 : 0) << "\n";
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

G 糖果

题目描述

在一个幼儿园里面有 n \mathit n n 个小朋友,分别编号 1 , 2 , . . . , n \text 1,2,...,n 1,2,...,n。在这些小朋友中有一些小朋友互为朋友关系,总共有 m \mathit m m 对朋友。
作为幼儿园老师,你想买一些糖果分给小朋友,你知道第 i \mathit i i 个小朋友想要至少 a i a_{i} ai​ 个糖果,否则他就会不开心。
同时,如果一个小朋友得到的糖果数小于他某个朋友得到的糖果数,他也会不开心。
请问你最少买多少糖果才能保证每个小朋友都不会不开心呢?

输入描述:

第一行以空格分隔的两个整数 n , m \mathit n,m n,m。
第二行以空格分隔的 n \mathit n n个正整数 a i a_{i} ai​ 。
接下来 m \mathit m m 行每行以空格分隔的两个正整数 u , v \mathit u,v u,v,代表 u \mathit u u 是 v \mathit v v 的朋友, v \mathit v v 是 u \mathit u u 的朋友。

1 ≤ n ≤ 1 0 6 1\leq n\leq 10^{6} 1≤n≤106
0 ≤ m ≤ 1 0 6 0\leq m\leq 10^{6} 0≤m≤106
1 ≤ a i ≤ 1 0 9 1\leq a_{i} \leq 10^{9} 1≤ai​≤109
1 ≤ u , v ≤ n , u ≠ v 1\leq u,v \leq n,u≠v 1≤u,v≤n,u​=v

输出描述:

购买的最少糖果数以保证每个小朋友都不会不开心。

分析:

并查集维护组内大小和最内最大值.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e6;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int sz[M + 5];
int fa[M + 5];

int tofind(int x)
{
    if(x == fa[x]) return x;
    return fa[x] = tofind(fa[x]);
}

ll a[M + 5];
ll mx[M + 5];

void work()
{
    int n, m; scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]), sz[i] = 1, fa[i] = i;
    for(int i = 1, a, b; i <= m; ++i)
    {
        scanf("%d %d", &a, &b);
        a = tofind(a), b = tofind(b);
        if(a != b)
        {
            fa[a] = b;
            sz[b] += sz[a];
        }
    }
    for(int i = 1, u; i <= n; ++i)
    {
        u = tofind(i);
        mx[u] = max(mx[u], a[i]);
    }
    ll ans = 0;
    for(int i = 1, u; i <= n; ++i)
    {
        u = tofind(i);
        if(u == i) ans += mx[u] * sz[u];
    }
    printf("%lld\n", ans);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

H 数字串

题目描述

牛牛发现了一种方法可以将只包含小写字母的字符串按照以下方式使其转换成一个数字串:
取其中的每个字母, a \mathit a a 转换为 1 \text 1 1 , b \mathit b b 转换为 2 \text 2 2… z \mathit z z转换为 2 6 \text 26 26,然后将这些数字拼接起来。
例如, a b c z \mathit abcz abcz 可以转换为 1 2326 \text 12326 12326。
现在给出一个只包含小写字母的字符串 S \mathit S S,你需要找到一个只包含小写字母的字符串 T \mathit T T,使得两个串不相同但是能转换成相同的数字串。

输入描述:

一行一个长度不超过 1 0 6 10^{6} 106 的小写字母字符串 S \mathit S S。

输出描述:

一行一个长度不超过 2 × 1 0 6 2×10^{6} 2×106 的小写字母字符串 T \mathit T T。
如果无解,请输出 - 1 \text -1 -1。
如果答案有解且你输出的字符串包含了除了小写字母以外的字符或长度超过了 2 × 1 0 6 2×10^{6} 2×106 ,那么你会得到“答案错误”的返回结果。
否则如果答案有解且你的答案与输入的字符串可以转换为一样的数字串,那么你的答案会被认为是正确的。

分析:

有一些小坑点的思维题,详见代码吧.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e6;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

char s[M + 5];

void work()
{
    scanf("%s", s + 1);
    int n = strlen(s + 1);
    bool f = 0;
    for(int i = 1; i <= n; ++i)
    {
        if(s[i] >= 'k' && s[i] != 't')
        {
            f = 1;
            break;
        }
    }
    if(f)
    {
        for(int i = 1; i <= n; ++i)
        {
            if(f && s[i] >= 'k' && s[i] != 't')
            {
                int num = s[i] - 'a' + 1;
                putchar(num / 10 + 'a' - 1);
                putchar(num % 10 + 'a' - 1);
                f = 0;
            }
            else    putchar(s[i]);
        }
        putchar('\n');
        return;
    }
    int p = -1;
    for(int i = 1; i < n; ++i)
    {
        if(s[i] == 't' || s[i] == 'j'
        || s[i + 1] == 't' || s[i + 1] == 'j') continue;
        int num = (s[i] - 'a' + 1) * 10 + (s[i + 1] - 'a' + 1);
        if(num <= 26) p = i;
    }
    if(~p)
    {
        for(int i = 1; i < p; ++i) putchar(s[i]);
        int num = (s[p] - 'a' + 1) * 10 + (s[p + 1] - 'a' + 1);
        putchar(num + 'a' - 1);
        for(int i = p + 2; i <= n; ++i) putchar(s[i]);
        putchar('\n');
        return;
    }
    printf("-1\n");
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

I 序列的美观度

题目描述

设一个长度为 m \mathit m m 的序列 S \mathit S S 的美观度等于有多少个整数 i \mathit i i 满足 1 ≤ i ≤ m − 1 1\leq i \leq m-1 1≤i≤m−1 且 S i = S i + 1 S_{i}=S_{i+1} Si​=Si+1​ ,其中 S i S_{i} Si​ 代表序列 S \mathit S S 的第 i \mathit i i 个元素。
给出一个长度为 n \mathit n n 的序列 a \mathit a a,问在他的所有子序列美观度最大是多少。
某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。

输入描述:

第一行一个正整数 n \mathit n n。
接下来一行 n \mathit n n 个以空格分隔的正整数 a i a_{i} ai​。

2 ≤ n ≤ 1 0 6 2\leq n \leq 10^{6} 2≤n≤106
1 ≤ a i ≤ 1 0 6 1\leq a_{i} \leq 10^{6} 1≤ai​≤106

输出描述:

输出一个整数代表答案。

分析:

记 f [ i ] f[i] f[i] 表示考虑了前 i i i 个数,且选择了第 i i i 个数的最大美观度.

则 f [ i ] = m a x ( f [ i − 1 ] + [ a [ i − 1 ] = = a [ i ] ] , f [ p r e [ a [ i ] ] ] + 1 ) f[i] = max(f[i - 1] + \left[a[i - 1] == a[i] \right], f[pre[a[i]]] + 1) f[i]=max(f[i−1]+[a[i−1]==a[i]],f[pre[a[i]]]+1).

答案即为 m a x 1 ≤ i ≤ n ( f [ i ] ) \underset{1 \leq i \leq n}{max}(f[i]) 1≤i≤nmax​(f[i]).

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e6;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int n;
int a[M + 5];
int f[M + 5];
int pre[M + 5];

int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

void work()
{
    n = read();
    for(int i = 1; i <= n; ++i) a[i] = read();
    for(int i = 1; i <= n; ++i)
    {
        f[i] = f[i - 1] + (a[i - 1] == a[i]);
        if(pre[a[i]])
        {
            f[i] = max(f[i], f[pre[a[i]]] + 1);
        }
        pre[a[i]] = i;
//        printf("f[%d] = %d\n", i, f[i]);
    }
    int mx = 0;
    for(int i = 1; i <= n; ++i) mx = max(mx, f[i]);
    printf("%d\n", mx);
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}

J 加法和乘法

题目描述

有一天牛牛和牛妹在做游戏,规则如下:
桌面上摆着 n \mathit n n 张纸牌,每张纸牌上写着一个正整数,由牛牛先手轮流执行以下操作:

1 . \text 1. 1.如果桌面上只剩一张纸牌,游戏结束,这张纸牌上的数字如果是奇数则牛牛胜利,反之牛妹胜利。

2 . \text 2. 2.当前行动玩家选择两张纸牌,设上面的数字分别为 X , Y \mathit X,Y X,Y,接下来玩家从加法和乘法中选择一个并应用到这两个数字上,得到结果为 Z \mathit Z Z,接下来将选择的两张纸牌丢弃,并拿一张新的纸牌放到桌面上,在上面写上 Z \mathit Z Z。
假设双方均以最优策略行动,最后谁会赢?

输入描述:

第一行一个正整数 n \mathit n n,代表开始的纸牌数。
第二行 n \mathit n n个空格分隔的正整数 a i a_{i} ai​ 代表开始纸牌上的数字。

1 ≤ n ≤ 1 0 6 1\leq n \leq 10^{6} 1≤n≤106
1 ≤ a i ≤ 1 0 9 1\leq a_{i} \leq 10^{9} 1≤ai​≤109

输出描述:

如果牛牛能赢,输出 N i u N i u \mathit NiuNiu NiuNiu,否则输出 N i u M e i \mathit NiuMei NiuMei。

分析:

每次操作共有 6 6 6 种,分别是:
奇 + 奇 = 偶 \qquad 奇 × \times × 奇 = 奇
奇 + 偶 = 奇 \qquad 奇 × \times × 偶 = 偶
偶 + 偶 = 偶 \qquad 偶 × \times × 偶 = 偶

因为如果最后留下的数是奇数,牛牛获胜.
所以牛牛一定会优先选择产生奇数的操作,牛妹一定会优先选择产生偶数的操作.

之后模拟每一次操作就好啦,详见代码.

代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;

const int M = (int)1e6;
const int N = (int)1e3;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const ll mod = (ll)1e9 + 7;

int n;
int a[M + 5];

int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

void work()
{
    scanf("%d", &n);
    int odd = 0, even = 0;
    for(int i = 1, a; i <= n; ++i)
    {
        a = read();
        if(a & 1) ++odd;
        else      ++even;
    }
    for(int i = 1; i <= n - 1; ++i)
    {
        if(i & 1)
        {
            if(even) --even;
            else     --odd;
        }
        else
        {
            if(odd >= 2) odd -= 2, ++even;
            else if(odd) --odd;
            else if(even) --even;
        }
    }
    puts(odd ? "NiuNiu" : "NiuMei");
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//    int T; scanf("%d", &T);
//    while(T--) work();
    work();
//    cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
    return 0;
}
腾讯笔试题编程题——纸牌游戏 题目描述 牛牛和羊羊正在玩一个纸牌游戏,这个游戏一共有n张纸牌,第i张纸牌上写着数字ai。 牛牛和羊羊轮流抽牌,牛牛先抽,每次抽牌,他们也可以从纸牌堆中任意选择一张抽出,直到纸牌被抽完。 他们的得分等于他们抽到的纸牌数字总和。 现在假设牛牛和羊羊都采用最优策略,请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。 输入描述 输入包括两行。 第一行包括一... 阅读详情

相关推荐

2022牛客寒假算法基础集训营1

A 九小时九个人九扇门 题意: 给定n个正整数,分别计算出数字根为1—9的组合数 涉及算法:数字根,线性dp 数字根: 将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于十为止所得到的数,即为数字根。 性质一: 两个正整数相加,原来两个数的数字根之和等于和的数字根。 性质二: 设一个正整数为 x,则其数字根为 (x - 1) % 9 + 1。 由数字根的性质二,数字根求解的核心代码: int f (int x) { return (x - 1

SecretMas的博客 4313

想都没想到的动态规划:猜数字游戏

牛牛和羊羊在玩一个有趣的猜数游戏。在这个游戏中,牛牛玩家选择一个正整数,羊羊根据已给的提示猜这个数字。第i个提示是"Y"或者"N",表示牛牛选择的数是否是i的倍数。 例如,如果提示是"YYNYY",它表示这个数使1,2,4,5的倍数,但不是3的倍数。 注意到一些提示会出现错误。例如: 提示"NYYY"是错误的,因为所有的整数都是1的倍数,所以起始元素肯定不会是"N"。 此外,例如"YNNY"的提示也是错误的,因为结果不可能是4的倍数但不是2的倍数。 现在给出一个整数n,表示已给的提示的长度。请计算出长度.

这是书生呀 862

宝塔部署若依前端出现502解决方法

若依系统是一个基于Java语言的开源项目,旨在帮助开发者减少开发时间,特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。系统分为前后端分离、分布式等架构前后端分离部署教程然而通过宝塔来部署若依系统会遇见一些问题,特此在这里记录一下。

m0_74823683的博客 776

【python】模拟斗牛纸牌游戏「牛牛」

相信大家都玩过或者看别人玩过一个纸牌游戏斗牛,或者也叫牛牛的吧,我们进行就来使用python来实现一下简单的模仿.至于相关的规则我这里简要的讲述一下: 就是每人五张牌,自己进行分堆,分成3,2两堆.三张牌的点数要是10的倍数,然后剩下两张牌的点数之和取个位就是你的牛数,当然如果没有任何三张牌可以凑成10的倍数,那么就是没牛.(JKQ都是按照10来计算,A按照1来计算) 举个例子:♥2 ♠5 ♦8 ♣J ♥A我们可以分成♥2 ♦8 ♣J一堆,♠5 ♥A一堆,那么这幅牌就是牛六 (是不是很好理解) ......

Khalil三省的博客妙妙屋 8485

SAP-PP MD04详解一

MD04是SAP运行MRP后的结果查询事务码,其他功能强大,标准功能比如:查询/更改物料主数据、转换计划订单到生产订单/采购申请、查询/更改各个MRP元素对应的单据等等。而且还可以附加标准的菜单或者自定义添加事务码上去。老铁将做一个MD04详细说明系列,本篇为第一篇之MRP元素说明。 我们来看看MD04基本界面 可以看到主要的数据显示界面,有日期、MRP元素、MRP元素数据、再计划日期、收货/需求、可用数量、工厂、库存地点等栏位。光标定位到MRP元素列,按F1即可看到各类MRP元素的说...

weixin_52158549的博客 1万+

ESP32系列之LVGL(三):Gui-Guider的使用

Gui-Guider的使用

m0_55986987的博客 2万+

【24网申精选】首都机场集团、青岛啤酒、腾讯、北汽...

武汉中末流211,12月面小米服务端实习,二面面试官是一面面试官的下属,人挺好的,感觉很亲切。双九本硕 由于男朋友明年才找工作,并且他找的肯定比我好,所以大概率不会在这两个城市直接定居,想之后再换到他工作的城市,没有工作经验,不知道选哪个好。现在大三上,今年寒假放的早,就想着找份实习,在这之前完全对找工作没有概念,对岗位要求上的各种开发框架和开发工具几乎完全不了解。

2301_78234743的博客 2913

别再让PyCharm吃光你的C盘!保姆级教程:安全迁移config、plugins和remote sources到D盘

本文提供了一份详细的PyCharm配置与缓存文件迁移指南,帮助开发者将config、plugins和remote sources等占用大量C盘空间的文件安全转移到D盘。通过修改data.properties文件和正确迁移顺序,确保PyCharm功能不受影响,同时释放宝贵的系统盘空间。

weixin_28836989的博客 423

【解题报告】2021牛客寒假算法基础集训营 3

2021牛客寒假算法基础集训营 3A 模数的世界 | 数论 + 构造B 内卷 | 数据结构 + 贪心C 重力坠击 | 搜索 或 状压DPD Happy New Year! | 暴力 (签到)E 买礼物 | 数据结构 (线段树+链表)F 匹配串 | 字符串G 糖果 | 并查集H 数字串 | 贪心I 序列的美观度 | DPJ 加法和乘法 | 博弈 2021牛客寒假算法基础集训营 3 【建议看一下解法的时间复杂度再酌情选择看题解】 A 模数的世界 | 数论 + 构造 时间复杂度 O(pT)O(pT)O(

溢流眼泪的博客 741

前端监控性能指标

文章目录前端监控性能指标性能指标阶段性指标关键性能指标小程序W3C Level 1兼容性常规用法注意事项1、计算HTML文档请求使用 Nav Timing2、计算静态资源使用 getEntriesByType('resource') 代替 getEntries()3、secureConnectionStart 问题4、跨域资源设置响应头 Timing-Allow-Origin5、注意属性值为 0 ...

foolbird 1347

喷涂机器人系列编程:ABB IRB 5500_(7).喷涂质量控制与优化

通过编程手段对ABB IRB 5500喷涂机器人进行质量控制和优化,可以显著提高喷涂的均匀性和附着力,减少涂层缺陷。具体的方法包括喷涂参数的调整、路径规划的优化、喷涂效果的检测与反馈,以及喷涂参数的动态调整。综合评估系统可以进一步确保喷涂质量的稳定性和一致性,帮助汽车制造企业提高产品质量和生产效率。

zhubeibei168的博客 851

2020牛客寒假算法基础集训营1 解题报告 Apare_xzc

2020牛客寒假算法基础集训营1 解题报告 Apare_xzc 比赛链接:2020牛客寒假算法基础集训营1<– 2020-02-04 13:00:00 至 2020-02-04 18:00:00 时长: 5小时 已有3952人报名 官方题解:【题解】牛客寒假集训营第一场 <– A. honoka和格点三角形 题目链接 分析:     &...

Apare_xzc的博客 2943

UNet改进(54):当医学图像分割遇上频域学习与自监督

本文提出了一种改进U-Net的方法,通过频域增强模块和代理任务模块提升医学图像分割性能。频域增强模块在傅里叶空间对特征图进行可学习的频率调制,重点增强高频细节特征;代理任务模块通过图像重建约束编码器保留关键信息。两个模块协同工作,在仅增加5%参数量的情况下,形成空间域、频域和重建约束三条互补的信息路径。该方法特别适用于需要精细边缘分割的医学图像任务,预期能提升5%-10%的边缘分割精度,在小样本场景效果更显著。部署时可移除代理任务模块,不影响推理效率。未来可探索空间自适应频域调制和更丰富的代理任务设计。

2501_91516851的博客 226

2025牛客寒假算法基础集训营4

1.首尾相同,val为2^(cnt-2)*(n-2)*2(理解为首尾是00和11两个情况所以乘2)2.首尾不同,val为2^(cnt-2)*2*2,所以总和为2^(cnt-1)*n,和三相同可以合并。’ 的个数为 p,显然将每个 ‘?思路:ai有n种情况,ai-1有m种情况,总共有n*m种,期望的和就是和的期望,所以将得到的不同的| ai-ai-1|的值相加再除以n*m,分出如下图三个部分,其中两个部分可以直接用等差求出,还有一个部分可以发现横竖可以构成两个相等的等差,如0 1 2 3 0 1 2 3。

2501_90365146的博客 1736

Flutter框架GetX从入门到精通第二篇:路由管理-告别繁琐的Navigator

Flutter框架GetX从入门到精通第二篇:告别繁琐的Navigator。本系列将带你从零开始,一步步掌握 GetX 框架的核心功能与实战技巧。

鹏多多的博客 170

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【解题报告】2021牛客寒假算法基础集训营4

【解题报告】2021牛客寒假算法基础集训营4前面的话A :九峰与签到题 | 模拟 (签到题)B: 武辰延的字符串 | exKMPD :温澈滢的狗狗 | 二分E: 九峰与子序列 | dpdpdp + 字符串哈希F: 魏迟燕的自走棋 | 并查集G:九峰与蛇形填数 | 差分 + 优先队列H:吴楚月的表达式 | 树形 dpdpdpI:九峰与分割序列 | dpdpdp + 单调队列优化J:邬澄瑶的公约数 | 数论参考 前面的话 比赛连接:2021牛客寒假算法基础集训营4 有些题目是自己思考做出来的,有些是看他人的

溢流眼泪的博客 1336

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

2024牛客寒假算法基础训练营4

2024牛客寒假营4【ABCDEGFHIK】

weixin_73603271的博客 1699

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2025牛客寒假算法基础集训营4题解

2025牛客寒假算法基础集训营4题解

FZANOTFOUND的博客 2133

2025牛客寒假算法基础集训营5

当下了三次时,此时棋盘还有三个空,因为小L可以一次下两个(这样做是最聪明的办法,赢的几率越大),那就判断鸡下在三个位置中任意一个,看小L可不可以赢;当下了四次,还有一个,小L占了,判断能不能赢。当x不断的开方,一定会变为1,y的话可以不断的平方,直到x乘2^n在可以经过无数次开方得到y的范围内,所以只要不是x和y里面只有一个是0的话,都可以转变。小L踩一下油门,速度会瞬间提升 10m/s,踩一下刹车,速度会瞬间降低 5m/s,踩一下离合,在踩离合这一过程中速度降低 10m/s,1s之后恢复原速。

2501_90365146的博客 1625

2025牛客寒假算法基础集训营6

字符,将其同时删去,剩余字符按原顺序拼接起来。形式化地,变鸡器选择两个下标 i,j(i<j)满足 si≠sj​,将这两个字符同时删去,剩余字符串拼接在一起得到s1s2⋯si−1si+1⋯sj−1sj+1⋯sn现在,小火想知道,对于给定的字符串 s,他能否通过变鸡器将该字符串变为 "CHICKEN"例如 (1,4),(3,5),(3,5),(7,5)是合法的,而 (1,2),(1,1)不是。这是因为在到达相同分数的情况下,我们只关心最小代价的路径,这样可以减少后续不必要的计算,将去重后的状态存储到。

2501_90365146的博客 1760

【解题报告】2022牛客寒假算法基础集训营1

【解题报告】2022牛客寒假算法基础集训营1A:九小时九个人九扇门题意 | 简单思路 | 数学 + dp代码B:炸鸡块君与FIFA22题意 | 中等思路 | 数据结构 + 简单同余代码C:Baby's first attempt on CPU题意 | 简单思路 | 简单dp代码D:牛牛做数论题意 | 中等思路 | 数论代码E:炸鸡块君的高中回忆F:中位数切分题意 | 中等思路 | 数据结构 + dp代码G:ACM is all you need题意 | 中偏难思路 | 思维 + 差分代码H:牛牛看云题意 |

溢流眼泪的博客 1202

2020牛客寒假算法基础集训营5 题目及解析

传送门:2020牛客寒假算法基础集训营5 由于是个人总结向,所以有点精简,而且可能和官方的标程截然不同,当然如果有什么疑问可以留言或者私信交流。 文章目录A. 模板B. 牛牛战队的比赛地C. C语言IDED. 牛牛与牛妹的约会E. Enjoy the gameF. 碎碎念H. HashI. I题是个签到题J. 牛牛战队的秀场 A. 模板 思路: 签到题吧,名字起的吓人,楞是先交了...

放荡者的茶会 1654

2026牛客寒假算法基础集训营5(BDFGJ)

摘要:本文包含4道编程题解:1) B题解决菱形瓷砖铺贴问题,通过行列索引奇偶性交替输出斜杠;2) F题计算字符串子串最大快乐值,通过枚举可能组合求最优解;3) G题模拟折纸操作后箭头状态转换,直接给出操作序列对应的100次状态结果;4) J题验证3×3矩阵是否为幻方,检查数字唯一性和行列对角线等和特性。每题均提供完整Python实现代码。

2402_83409754的博客 2610

2020牛客寒假算法基础集训营6 题目及解析

传送门:2020牛客寒假算法基础集训营1 题目及解析 传送门:2020牛客寒假算法基础集训营4 题目及解析 传送门:2020牛客寒假算法基础集训营5 题目及解析 传送门:2020牛客寒假算法基础集训营6 题目及解析 由于是个人总结向,所以有点精简,而且可能和官方的标程截然不同,当然如果有什么疑问可以留言或者私信交流。 文章目录A. 配对B. 图C. 汉诺塔D. 重排列 A. 配对...

放荡者的茶会 1502

2026牛客寒假算法基础集训营3(ABCFGHJ)

本文摘要了多个算法题目及其解决方案:1) 判断数字是否为连续自然数乘积(A题);2) 寻找数组中最大公约数大于1的元素对(B题);3) 通过子序列反置使相邻字符不同的最少操作次数(C题);4) 网格博弈中计算最短路径(F题);5) 天平砝码调整的最小移除数量(G题);6) 构造满足三角形面积条件的坐标(H题);7) 完全二叉树中同深度节点数查询(J题)。每个问题都提供了简洁的Python实现,涉及数学运算、素数筛选、动态规划等算法技巧。

2402_83409754的博客 2820

2024牛客寒假算法基础训练营1

2024牛客寒假营1【ABCGLMEFI】

weixin_73603271的博客 1221
上一篇: 2021牛客寒假算法基础集训营2【解题报告】
下一篇: 2021牛客寒假算法基础集训营4【解题报告】
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值