AcWing 第 60 场周赛 (RANK51)

简介: AcWing 第 60 场周赛 (RANK51)

@[TOC]

比赛链接: 第 60 场周赛

二十分钟下班,有进步。

在这里插入图片描述

B.AcWing 4495. 数组操作

题目

给定一个长度为 n 的正整数数组 a1,a2,…,an。

请你对该数组进行 k 次操作,每次操作具体如下:

  • 如果数组中存在非零元素,则找到其中的最小非零元素 x,将其输出,并让数组中的所有非零元素都减去 x。
  • 如果数组中不存在非零元素,则输出 0 即可。

思路: 模拟

因为每次操作都是先找到数组中的最小元素,并且让数组中每个元素都减去x,那么可以先将数组从小到大排序,此时数组呈非单调递减,全部都减去一个数后,也不影响数组的顺序,还是非单调递减。

那么我们就可以枚举每个元素,从前到后依次操作,最多进行k次。如果当前元素已经等于0的话那么就不能在操作了,找下一个大于0的数,如果直到最后还找不到k个的话,那么就都输出0即可

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 1e6 + 10;
ll a[N];
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int n, k;
    cin >> n >> k;
    // 记录当前总共减去了多少
    ll ans = 0;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++)
    {
        // 如果当前已经被减完的话,就跳过当前这个数,因为每个数都要找大于0的
        a[i] = max(0ll, a[i] - ans);
        // 如果当前元素大于0,并且还需要操作的话就继续操作
        if (a[i] > 0 && k > 0)
        {
            // 操作次数减1
            k--;
            cout << a[i] << endl;
        }
        // 减去元素加上
        ans += a[i];
    }
    while (k--)
    {
        puts("0");
    }
    return 0;
}

C.AcWing 4496. 吃水果

题目

n 个小朋友站成一排,等着吃水果。

一共有 m 种水果,每种水果的数量都足够多。

现在,要给每个小朋友都发一个水果,要求:在所有小朋友都拿到水果后,恰好有 k 个小朋友拿到的水果和其左边相邻小朋友拿到的水果不同(最左边的小朋友当然不算数,即最左边的小朋友不包含在 k 个小朋友内)。

请你计算,一共有多少种不同的分发水果的方案。

思路: 状态机模型

根据闫氏dp法分析,总共有三个参数

状态表示f[i][j][k] 表是前i个小朋友,其中有j个小朋友被选中的总方案数,k==0时,表示第i个小朋友没被选中,k==1表示第i个小朋友被选中

状态计算

  • 当第i个小朋友没被选上时:f[i][j][0] = f[i-1][j][1] + f[i-1][j][0],如果当前小朋友没被选上,那么他一定要和前一个小朋友拿的水果一样,所以就等于前一个的方案数
  • 当第i个小朋友被选上时:f[i][j][1] = (f[i-1][j-1][0] + f[i-1][j-1][1]) * (m-1) ,因为选中的要和前一个不一样,所以方案数要乘上m-1

代码1

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 2010, mod = 998244353;
ll f[N][N][2];
ll n, m, k;
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    
    cin >> n >> m >> k;
    // 初始化,第一位置不能选,所以有m种水果可以选
    f[1][0][0]=m;
    for (int i = 2; i <= n; i++)
    {
        f[i][0][0] = f[i - 1][0][0]  % mod;
        for (int j = k; j >= 1; j--)
        {
            f[i][j][0] = f[i - 1][j][1]  % mod + f[i - 1][j][0]  % mod;
            f[i][j][1] = f[i - 1][j - 1][1] * (m - 1) % mod + f[i - 1][j - 1][0] * (m-1) % mod;
        }
    }
    ll ans = (f[n][k][1] + f[n][k][0]) % mod;
    cout << ans;
    return 0;
}

我们还可以优化,可以不用表示状态那一维。

01背包

状态表示f[i][j] 表是前i个小朋友,其中有j个小朋友被选中的总方案数

状态计算

  • 当第i个小朋友没被选上时:f[i][j] += f[i-1][j],如果当前小朋友没被选上,那么他一定要和前一个小朋友拿的水果一样,所以就等于前一个的方案数
  • 当第i个小朋友被选上时:f[i][j] += f[i-1][j-1] * (m-1) ,因为选中的要和前一个不一样,所以方案数要乘上m-1

代码2

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int N = 2010, mod = 998244353;
ll f[N][N];
ll n, m, k;
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);

    cin >> n >> m >> k;
    f[1][0] = m;
    for (int i = 2; i <= n; i++)
    {
        f[i][0] = f[i - 1][0] % mod;
        for (int j = k; j >= 1; j--)
        {
            f[i][j] = (f[i - 1][j] + f[i - 1][j - 1] * (m - 1)) % mod;
        }
    }
    ll ans = f[n][k];
    cout << ans;
    return 0;
}
相关文章
|
前端开发 JavaScript
百度统计失效,referrer背锅了
前段时间遇到一个问题,就是我的个人网站需要接入第三方百度统计,因为我的文章图片有来自第三方微信后台上传的文章,所以使用&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot;&gt;解决图片访问403的问题,但是此时这个导致我百度统计失效了,于是去查询了一下referrer这个特性。
584 0
百度统计失效,referrer背锅了
|
前端开发 数据库 数据安全/隐私保护
【项目实战】登录与注册业务的实现(前端+后端+数据库)
【项目实战】登录与注册业务的实现(前端+后端+数据库)
3086 0
【项目实战】登录与注册业务的实现(前端+后端+数据库)
|
应用服务中间件 索引 nginx
生产环境ES查询延迟排查
最近经常收到业务方配置的ES查询延迟告警,同样的请求手动在Kibana控制台执行只需几十毫秒就返回结果。受影响的整个链路情况如下,php应用程序通过部署在ES集群各节点上的nginx访问ES请求查询数据。
5757 0
|
传感器 算法 Ubuntu
大疆M2006电机测试文档
本文是关于大疆RoboMaster M2006电机的测试文档,介绍了在Ubuntu20.04环境下通过ROS读取电机反馈信息、控制电机移动,并利用PID控制算法实现速度闭环的测试流程,涵盖了测试材料、接线方法、电机校准、CAN通讯测试以及在ROS中的移植和PID调节的详细步骤和方法。
1360 0
大疆M2006电机测试文档
|
数据挖掘
R语言方差分析(ANOVA):理解与应用
【8月更文挑战第31天】ANOVA是一种强大的统计方法,用于比较三个或更多组之间的均值差异。在R语言中,我们可以轻松地使用`aov()`函数进行ANOVA分析,并通过后置检验(如TukeyHSD检验)来进一步分析哪些组之间存在显著差异。ANOVA在多个领域都有广泛的应用,是数据分析中不可或缺的工具之一。
1411 1
|
人工智能 Android开发 C++
ChatGPT最强竞争对手,无需魔法,直接使用
ChatGPT最强竞争对手,无需魔法,直接使用
|
存储 NoSQL Linux
《探索 Linux 命令:systemd-coredumpctl》
**《systemd-coredumpctl概览》** `systemd-coredumpctl`, Linux中管理&分析core dump的利器。集中管控systemd生成的转储,详述crash细节。用`--list`查看所有转储,`--info &lt;ID&gt;`深入单一转储。需注意权限、存储管理,配gdb深化分析。精通此命令,加速问题诊断。#LinuxTips #CoreDumpAnalysis
|
缓存 NoSQL 算法
LRU算法与Caffeine、Redis中的缓存淘汰策略详解与比较
在实际应用中,我们需要考虑数据访问模式、内存限制以及性能需求等因素来选择最合适的缓存淘汰策略。通过深入了解LRU算法及其在不同缓存库中的应用,我们可以更好地优化我们的应用程序的性能。
|
Kubernetes 数据可视化 jenkins
可视化 Tekton 组件 Tekton Dashboard
Tekton Dashboard 使用指南。
4498 0
可视化 Tekton 组件 Tekton Dashboard
考研高数之无穷级数题型一:判断收敛性、求收敛半径以及收敛域和收敛区间(题目讲解)
考研高数之无穷级数题型一:判断收敛性、求收敛半径以及收敛域和收敛区间(题目讲解)
1798 0