/img/dodola.png

一只小菜鸡的Blog

2024牛客寒假营5||补题

一个由$n$个正整数组成的数组,求其中质数和合数共有几个。

$n(1\leq n\leq 100)$

$a_i(1\leq a_i\leq 100)$

1不是质数也不是合数。

1
2
3
4
5
6
7
8
9
void solve() {
    int n;cin >> n;
    int ans = 0;
    for (int i = 0;i < n;i++) {
        int x;cin >> x;
        if (x>1)ans++;
    }
    cout << ans << '\n';
}

给一个数组中一些位置插入$0$,要求插入后任意不是全$0$子段的平均值大于等于$1$,询问最多插入多少个$0$

$n(1\leq n\leq 10^5)$

$a_i(1\leq a_i\leq 10^9)$

从第一位开始贪,统计在每一位前最多可以插入多少个0,考虑两数之间的0的数目不能大于这2位之间允许的最大值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void solve() {
    int n;cin >> n;
    vector<ll>a(n + 2);
    vector<ll>b(n + 2);
    for (int i = 1;i <= n;i++) {
        cin >> a[i];
        b[i] = a[i] - 1;
    }
    b[0] = 1e9 + 50;
    b[n + 1] = 1e9 + 50;
    ll ans = 0;

    for (int i = 0;i <= n;i++) {
        // for (int j = 0;j <= n + 1;j++)cout << b[j] << ' ';cout << endl;
        if (b[i] >= b[i + 1]) {
            ans += b[i + 1];
            ll tmp = b[i + 1];
            b[i + 1] = 0;
            b[i] -= tmp;
        }
        else {
            ans += b[i];
            ll tmp = b[i];
            b[i] = 0;
            b[i + 1] -= tmp;
        }
    }

    cout << ans << endl;
}

有一个长为$n$的数组$a$

2024牛客寒假营3||补题

在不考虑单词词性的前提下,只要求两个单词的首字母忽略大小写相同时就认为它们可能是一组ubuntu代号,请你编写程序判断给定的两个单词是否可能是一个ubuntu代号。

$T(1\leq T \leq 10^5)$

$S,T(1\leq |S|,|T|\leq 50)$

按题意判断即可

1
2
3
4
5
6
7
void solve() {
    string s, t;cin >> s >> t;
    if (s[0] == t[0] || abs(s[0] - t[0]) == abs('a' - 'A')) {
        cout << "Yes\n";
    }
    else cout << "No\n";
}

一个首尾相连的数组,若相邻的两个数之和为偶数选择拿走一个然后可以随意交换一对数,轮流操作,不能再操作的一方输。清楚姐姐先手。

$T(1\leq T \leq 10^4)$

$N(1\leq N\leq 26)$

$a_i(0\leq a_i \leq 10^9)$

只有1个数时直接取走,先手赢。

2个数时:奇偶/奇奇/偶偶,都是后手赢。

3个数时:奇偶奇/偶奇偶/奇奇奇/偶偶偶,都是先手赢。

2024牛客寒假营1||补题

给一个字符串,判断其中是否包含dfs子序列和DFS子序列。

$T(1≤T≤100)$

$n(1≤n≤50)$

直接搜。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void solve() {
    int n;cin >> n;
    string s;cin >> s;
    int f1 = 1, f2 = 1;
    int p = s.find('D');
    if (p != -1) {
        p = s.find('F', p);
        if (p != -1) {
            p = s.find('S', p);
            if (p == -1) { f1 = 0; }
        } else { f1 = 0; }
    }
    else { f1 = 0; }
    p = s.find('d');
    if (p != -1) {
        p = s.find('f', p);
        if (p != -1) {
            p = s.find('s', p);
            if (p == -1) { f2 = 0; }
        } else { f2 = 0; }
    }
    else { f2 = 0; }
    cout << f1 << " " << f2 << endl;
}

https://uploadfiles.nowcoder.com/images/20240121/0_1705849989132/3C73FD698696250B894A2646C4440896

图论基础||存储图||DFS、BFS(图论)

上课讲过一大堆这里不再赘述,直接学习代码实现。

例图展示:

graph LR
v1((v1))--4-->v2((v2))
v1((v1))--9-->v6((v6))
v3((v3))--19-->v2((v2))
v3((v3))--22-->v1((v1))
v4((v4))--17-->v3((v3))
v5((v5))--29-->v8((v8))
v6((v6))--12-->v1((v1))
v6((v6))--9-->v5((v5))
v6((v6))--4-->v7((v7))
v7((v7))--25-->v4((v4))
v8((v8))--7-->v7((v7))
v8((v8))--11-->v3((v3))

设n个点,m条边

上图的数据(按照 起点-终点-权值):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
8 12
5 8 29
6 1 12
8 3 11
1 2 4
3 1 22
4 3 17
7 4 25
6 5 9
8 7 7
1 6 9
3 2 19
6 7 4
  • 遍历效率低、不能存重边、初始化效率低初始化O(n^2)时间,建图O(m)时间、空间开销大O(n^2)
  • 对于稀疏图来说大部分是INF,空间利用效率也不高

前向星涉及排序,所以其时间复杂度和排序算法有关,一般情况下时间复杂度为O(mlog m),空间上需要两个数组(记录边的边数组、记录各点在边数组中起始位置的head数组),空间复杂度为O(m+n)