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

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

A 智乃的Hello XXXX

签到


B 智乃买瓜

题意:给定n个瓜,查询重量从1-m的买瓜方案数。三种方式买瓜:买、买一半、不买

思路:
	1. f[i][j] 表示前i个瓜,重量为j的方案数
		f[i][j] = (f[i - 1][j] + f[i - 1][j - w[i]] + f[i - 1][j - w[i] / 2]) % mod
	2. 压缩一维,滚动数组。
		f[j] += f[j - w[i]];
		f[j] += f[j - w[i] / 2];
void solve() {
    cin >> n >> m;
    f[0] = 1;
    for (int i = 0; i < n; i++) {
        int x; cin >> x;
        for (int j = m; j >= 1; j--) {
            if(j - x >= 0) f[j] = (f[j] + f[j - x]) % mod;
            if(j - x / 2 >= 0) f[j] = (f[j] + f[j - x / 2]) % mod;
        }
    }
    for (int i = 1; i <= m; i++) cout << f[i] << ' ';
}

C 智乃买瓜(another version)


D 智乃的01串打乱

签到

n = int(input())
s = input()
print(s[n - 1:] + s[:n - 1])

E 智乃的数字积木(easy version)

题意:一串数字,每位对应有不同颜色,同颜色且相邻之间可以任意无数次相互换位置。并由k个提问,每次将x颜色的所有位置改成y颜色。问k次提问前该数最大值,和每次询问该数的最大值。

思路:
	1. 因为k<10,所以本题数据范围不大,直接暴力排序。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100010, mod = 1e9 + 7;
int n, m, k;
int a[N];
bool st[N];

bool cmp(char x, char y) { return x > y; }

signed main() {
    cin >> n >> m >> k;
    string s; cin >> s;
    for (int i = 0; i < n; i++) cin >> a[i];
    int ans1 = 0;
    for (int i = 0; i < n; i++) {
        if(st[i]) continue;
        st[i] = true;
        int l = i - 1, r = i + 1;
        while(l >= 0 && a[l] == a[i]) st[l] = true, l--;
        while(r < n && a[r] == a[i]) st[r] = true, r++;
        sort(s.begin() + l + 1, s.begin() + r, cmp);
    }
    for (int i = 0; i < s.size(); i++) 
        ans1 = (s[i] - '0' + ans1 * 10 % mod) % mod;
    
    cout << ans1 << endl;
    
    while(k--) {
        int x, y; cin >> x >> y;
        memset(st, 0, sizeof st);
        for (int i = 0; i < n; i++)
            if(a[i] == x) a[i] = y;
        for (int i = 0; i < n; i++) {
            if(st[i]) continue;
            st[i] = true;
            int l = i - 1, r = i + 1;
            while(l >= 0 && a[l] == a[i]) st[l] = true, l--;
            while(r < n && a[r] == a[i]) st[r] = true, r++;
            sort(s.begin() + l + 1, s.begin() + r, cmp);
        }
        int ans2 = 0;
        for (int i = 0; i < s.size(); i++) 
        ans2 = (s[i] - '0' + ans2 * 10 % mod) % mod;
    
        cout << ans2 << endl;
    }
    
    return 0;
}

F 智乃的数字积木(hard version)


G 智乃的树旋转(easy version)


H 智乃的树旋转(hard version)


I 智乃的密码

题意:[L,R]范围长的子串,满足有大写,小写,数字,其它字符的三种以上就算符合条件,ans++

#include <bits/stdc++.h>
using namespace std;
const int N = 100100;

int A, B, C, D;

int n, L, R;

string s;

bool judge()
{
    return (A > 0) + (B > 0) + (C > 0) + (D > 0) >= 3;
}
void add(char c)
{
    if (c >= 'A' && c <= 'Z')
        A++;
    else if (c >= 'a' && c <= 'z')
        B++;
    else if (c >= '0' && c <= '9')
        C++;
    else
        D++;
}
void des(char c)
{
    if (c >= 'A' && c <= 'Z')
        A--;
    else if (c >= 'a' && c <= 'z')
        B--;
    else if (c >= '0' && c <= '9')
        C--;
    else
        D--;
}
int main()
{

    cin >> n >> L >> R;
    cin >> s;
    int       l = 0, r = -1;
    long long ans = 0;
    while (l < n - L + 1 && r < n) {
        while (!judge() && r < n) add(s[++r]);
        if (r <= l + L - 1)
            ans += min(R + l - 1, n - 1) - l - L + 2;
        else if (r <= l + R - 1)
            ans += min(R + l - 1, n - 1) - r + 1;
        des(s[l++]);
    }
    cout << ans << endl;;
    return 0;
}

J 智乃的C语言模除方程


K 智乃的C语言模除方程(another version)


L 智乃的数据库

pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღCauchyོꦿ࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值