ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-27 14:31:12  阅读:97  来源: 互联网

标签:include int sum long 牛客 2022 集训营 scanf MOD


A
首先把原数组中的数按题目要求进行转化
状态表示\(f[i][j]\)表示从前\(i\)个选,凑成的数组为\(j\)的所有方案数

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10, MOD = 998244353;
int n;
int a[N], f[N][10];
signed main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i ++ )  scanf("%lld", &a[i]);
    for (int i = 1; i <= n; i ++ ) {
        int m = a[i];
        while (m >= 10) {
            int sum = 0;
            while (m) {
                sum += m % 10;
                m /= 10;
            }
            m = sum;
        }
        a[i] = m;
    }
    f[0][0] = 1;
    for (int i = 1; i <= n; i ++ ) {
        for (int j = 1; j <= 9; j ++ ) {
            f[i][j] = (f[i][j] + f[i - 1][j]) % MOD;
            int m = (a[i] + j) % 10;
            if (a[i] + j >= 10)    m ++;
            f[i][m] = (f[i][m] + f[i - 1][j]) % MOD;
        }
        f[i][a[i]] = (f[i][a[i]] + 1) % MOD;
    }
    for (int i = 1; i <= 9; i ++ )
        printf("%d ", f[n][i]);
    return 0;
}

C
模拟

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
    scanf("%d", &n);
    int cnt = 0;
    int last1 = 0, last2 = 0, last3 = 0;
    for (int i = 1; i <= n; i ++ ) {
        int a, b, c;
        cin >> a >> b >> c;
        if (c) {
            if (last3 < 1) {
                cnt ++;
                last1 ++;
                last2 ++;
                last3 = 1;
            }
        }
        if (b) {
            if (last2 < 2) {
                cnt += (2 - last2);
                last1 += (2 - last2);
                last2 = 2;
            }
        }
        if (a) {
            if (last1 < 3) {
                cnt += (3 - last1);
                last2 += (3 - last1);
                last1 = 3;
            }
        }
        last3 = last2;
        last2 = last1;
        last1 = 0;
    }
    printf("%d\n", cnt);
    return 0;
}

D
对于问题一打表找规律
对于问题二从大到小遍历,找到第一个质数

#include <bits/stdc++.h>
#define int long long
using namespace std;
int T, n, l, r;
int primes[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
bool is_prime(int x)
{
    if (x < 2) return false;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)
            return false;
    return true;
}
signed main() {
    scanf("%d", &T);
    while (T -- ) {
        scanf("%lld", &n);
        if (n == 1) {printf("-1\n"); continue;}
        int sum = 1;
        for (int i = 0; i <= 24; i ++ ) {
            if (sum * primes[i] > n) {
                printf("%d ", sum);
                break;
            }
            else sum *= primes[i];
        }
        for (int i = n; ; i -- ) {
            if (is_prime(i)) {
                printf("%d\n", i);
                break;
            }
        }
    }
    return 0;
}

E
签到

#include <bits/stdc++.h>
using namespace std;
int T, n, m;
int main() {
    scanf("%d", &T);
    while (T -- ) {
        scanf("%d%d", &n, &m);
        if (n == m && m == 1) {printf("1\n"); continue;}
        if (m == 1) {printf("-1\n"); continue;}
        int k = (int)ceil((n - m) * 1.0 / (m - 1) * 1.0);
        printf("%d\n", k * 2 + 1);
    }
    return 0;
}

F
签到

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int T, n, m, sum;
int a[N];
int main() {
    scanf("%d", &T);
    while (T -- ) {
        sum = 0;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i ++ )  scanf("%d", &a[i]);
        for (int i = 1; i <= n; i ++ ) {
            if (a[i] >= m)  sum ++;
            else sum --;
        }
        printf("%d\n", sum > 0 ? sum : -1);
    }
    return 0;
}

H
前缀和

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int n, tot, sum;
int a[N], b[N], s[N];
signed main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i ++ )  scanf("%lld", &a[i]);
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i ++ )
        s[i] = s[i - 1] + a[i];
    for (int i = 1; i <= n; i ++ ) {
        int l = i, r = n;
        while (l < r) {
            int mid = l + r >> 1;
            if (a[mid] >= 1000 - a[i]) r = mid;
            else l = mid + 1;
        }
        int k = n - l + 1;
        if (k >= l - i)    sum += a[i] * (k - l + i);
        else sum -= a[i] * (l - i - k);
        sum += s[n] - s[l - 1];
        sum -= s[l - 1] - s[i - 1];
        tot += l - i;        
    }
    if (n * (n + 1) / 2 - tot >= tot)    sum -= (n * (n + 1) / 2 - tot * 2) * 1000;
    else sum += (tot * 2 - n * (n + 1) / 2) * 1000;
    printf("%lld\n", sum);
    return 0;
}

I
概率 + 逆元
答案为\(m \times \frac{2^n-2}{2^n}\)

#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
int T, n, m;
int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k) {
        if (k & 1)    res = (long long)res * t % p;
        t = (long long)t * t % p;
        k >>= 1;
    }
    return res;
}
int main() {
    scanf("%d", &T);
    while (T -- ) {
        scanf("%d%d", &n, &m);
        printf("%d\n", (long long)m * (qmi(2, n, MOD) - 2) % MOD * (qmi(qmi(2, n, MOD), MOD - 2, MOD)) % MOD);
    }
    return 0;
}

J

#include <bits/stdc++.h>
#define x first
#define y second
#define PII pair<int, int>
using namespace std;
const int N = 1e4 + 10;
int T, n, m, s;
int a[N], b[N];
int main() {
    scanf("%d", &T);
    while (T -- ) {
        scanf("%d%d%d", &n, &m, &s);
        vector<PII> v;
        for (int i = 1; i <= n; i ++ ) {
            int x;
            scanf("%d", &x);
            v.push_back({x, 1});
        }
        for (int i = 1; i <= m; i ++ ) {
            int x;
            scanf("%d", &x);
            v.push_back({x, 0});
        }
        sort(v.begin(), v.end());
        reverse(v.begin(), v.end());
        if (n < (s + 1) / 2) {printf("-1\n"); continue;}
        else {
            int sum0 = 0, sum1 = 0, sum = 0;
            for (int i = 0; sum0 + sum1 < s; i ++ ) {
                if (v[i].y == 1) {
                    sum0 ++;
                    sum += v[i].x;
                }
                else {
                    if (sum1 < s / 2) {
                        sum += v[i].x;
                        sum1 ++;
                    }
                }
            }
            printf("%d\n", sum);
        }
    }
    return 0;
}

L

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int T, n, x, y;
double ans;
char s[N];
int main() {
    scanf("%d", &T);
    while (T -- ) {
        scanf("%d", &n);
        scanf("%s", s + 1);
        x = 0, y = 0, ans = 0.0;
        for (int i = 1; i <= n; i ++ ) {
            if (s[i] == 'L')    x --;
            else if (s[i] == 'R')   x ++;
            else if (s[i] == 'U')    y ++;
            else    y --;
            ans = max(ans, sqrt(x * x * 1.0 + y * y * 1.0));
        }
        printf("%.10lf\n", ans);
    }
    return 0;
}

标签:include,int,sum,long,牛客,2022,集训营,scanf,MOD
来源: https://www.cnblogs.com/Angels-of-Death/p/15849736.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有