Codeforces Round 962 (Div. 3) A~F

news2024/9/21 4:30:36

A.Legs(贪心)

题意:

农夫约翰的农场又迎来了美好的一天。

农夫约翰来到农场后,数了数共 n n n条腿。众所周知,农场里只住着鸡和牛,一只鸡有 2 2 2条腿,而一头牛有 4 4 4条腿。

假设约翰农场主数清了所有动物的腿,那么他的农场里最少有多少动物?

分析:

求最少有几只动物,贪心考虑让牛最多,然后计算剩下鸡的数量, n n n先除 4 4 4,余数再除 2 2 2

代码:

#include<bits/stdc++.h>

using namespace std;
int n;

void solve() {
    cin >> n;
    int ox = n / 4;
    n -= ox * 4;
    int chic = n / 2;
    cout << ox + chic << endl;
}

int main() {
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

B.Scale(思维)

题意:

蒂娜有一个行数为 n n n列数为 n n n的正方形网格。网格中的每个单元格要么是 0 0 0要么是 1 1 1

蒂娜希望将网格缩小 k k k k k k n n n的除数)。为此,蒂娜将网格分割成 k × k k\times k k×k个不重叠的单元格块,使得每个单元格都正好属于一个单元格块。

然后,蒂娜将每个单元格块替换为与单元格块中单元格值相等的单个单元格。保证同一区块中的每个单元格都具有相同的值

帮助蒂娜将网格缩小 k k k倍。

分析:

可以发现每一个 k × k k×k k×k网格中的值是一样的,枚举从 1 , k + 1 , 2 k + 1 1,k+1,2k+1 1,k+1,2k+1到$n−k+1的每一行和从 1 , k + 1 , 2 k + 1 1,k+1,2k+1 1,k+1,2k+1 n − k + 1 n−k+1 nk+1的每一列,输出这些行列上的数字即可。

代码:

#include<bits/stdc++.h>

using namespace std;
const int N = 1005;
bool mp[N][N];

void solve() {
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            scanf("%1d", &mp[i][j]);
    for (int i = 1; i <= n; i += k) {
        for (int j = 1; j <= n; j += k)
            cout << mp[i][j];
        cout << endl;
    }
}

int main() {
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

C.Sort(前缀和)

题意:

给你两个长度为 n n n的字符串 a a a b b b。然后回答 q q q个问题。

每个查询都会给你一个由 l l l r r r限定的范围。在一次操作中,您可以选择一个整数 i i i( l ≤ i ≤ r l\leq i\leq r lir),并设置 a i = x a_i=x ai=x其中 x x x是您想要的任何字符。计算必须执行的最小操作数,以便 sorted(a[l..r]) = sorted(b[l..r]) \texttt{sorted(a[l..r])}=\texttt{sorted(b[l..r])} sorted(a[l..r])=sorted(b[l..r])对一个查询执行的操作不会影响其他查询。

对于任意字符串 c c c sorted(c[l..r]) \texttt{sorted(c[l..r])} sorted(c[l..r])表示按词典顺序排序的由字符 c l , c l + 1 , . . . , c r c_l,c_{l+1},...,c_r cl,cl+1,...,cr组成的子串。

分析:

c n t 1 i , j cnt1_{i,j} cnt1i,j为字符串 a a a种前 i i i个字符里 j j j字符的数量, c n t 2 i , j cnt2_{i,j} cnt2i,j为字符串 b b b种前 i i i个字符里 j j j字符的数量。可以先把 c n t 1 cnt1 cnt1 c n t 2 cnt2 cnt2预处理出来。

要使得区间内每个字符的数目相等,需要先统计差异的个数。对于每次询问,依次枚举每个字符,设 x x x c n t 1 r , j − c n t 1 l − 1 , j cnt1_{r,j}−cnt1_{l−1,j} cnt1r,jcnt1l1,j y y y c n t 2 r , j − c n t 2 l − 1 , j cnt2_{r,j}−cnt2_{l−1,j} cnt2r,jcnt2l1,j,使 a n s ans ans累加上 ∣ x − y ∣ ∣x−y∣ xy。最后答案即为 a n s 2 \frac{ans}{2} 2ans

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const LL N = 2e5 + 5;
LL n, q;
char a[N], b[N];
LL cnt1[N][30], cnt2[N][30];

void solve() {
    scanf("%lld %lld", &n, &q);
    scanf("%s", a + 1);
    scanf("%s", b + 1);
    for (LL i = 1; i <= n; i++)
        for (LL j = 1; j <= 26; j++)
            cnt1[i][j] = cnt1[i - 1][j] + (a[i] == 'a' + j - 1);
    for (LL i = 1; i <= n; i++)
        for (LL j = 1; j <= 26; j++)
            cnt2[i][j] = cnt2[i - 1][j] + (b[i] == 'a' + j - 1);
    while (q--) {
        LL l, r, res = 0;
        scanf("%lld %lld", &l, &r);
        for (LL i = 1; i <= 26; i++) {
            LL x = cnt1[r][i] - cnt1[l - 1][i];
            LL y = cnt2[r][i] - cnt2[l - 1][i];
            if (x > y)
                res += x - y;
        }
        printf("%lld\n", res);
    }
    for (LL i = 1; i <= n; i++)
        for (LL j = 1; j <= 26; j++)
            cnt1[i][j] = cnt2[i][j] = 0;
}

int main() {
    LL t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

D.Fun(数学)

题意:

给定两个整数 n n n x x x,求 a b + a c + b c ≤ n ab+ac+bc\le n ab+ac+bcn a + b + c ≤ x a+b+c\le x a+b+cx正整数的三连式( a , b , c a,b,c a,b,c)的个数。

注意顺序问题(例如( 1 , 1 , 2 1,1,2 1,1,2)和( 1 , 2 , 1 1,2,1 1,2,1) 被视为不同), a a a b b b c c c必须严格大于 0 0 0

分析:

考虑只枚举 a , b a,b a,b

因为 a + b + c ≤ x a+b+c≤x a+b+cx,所以 c ≤ x − a − b c≤x−a−b cxab
又因为 a b + a c + b c ≤ n ab+ac+bc≤n ab+ac+bcn,所以 a b + ( a + b ) c ≤ n ab+(a+b)c≤n ab+(a+b)cn,即 c ≤ a + b n − a b c≤\frac{a+b}{n−ab} cnaba+b

因此 c c c可能的个数为 m i n ( x − a − b , n − a b a + b ) min(x−a−b,\frac{n−ab}{a+b}) min(xab,a+bnab)。 这样时间复杂度为 O ( n 2 ) O(n^2) O(n2),但不是所有的 a , b a,b a,b都能有合法的 c c c

因为 a b + a c + b c ≤ n ab+ac+bc≤n ab+ac+bcn,所以 a b ≤ n − a − b ab≤n−a−b abnab,所以 a b ≤ n ab≤n abn,即 b ≤ n a b≤\frac{n}{a} ban

即当确定了 a , b a,b a,b的可能个数为 n a \frac{n}{a} an,那么合法 b b b的总数量为 ∑ a = 1 n n a \sum_{a=1}^n \frac{n}{a} a=1nan,这是一个调和级数,所以总数量约为 n l o g n nlogn nlogn量级。所以只要保证 a b ≤ n ab≤n abn,时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),可以通过,

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;

void solve() {
    LL n, x, ans = 0;
    cin >> n >> x;
    for (LL a = 1; a < x; a++) {
        for (LL b = 1; b < x; b++) {
            if (a * b > n) {
                break;
            }
            LL c = max(0LL, min(x - a - b, (n - a * b) / (a + b)));
            ans += c;
        }
    }
    cout << ans << "\n";
}

int main() {
    LL t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

E.Decode(前缀和)

题意:

为了获得你最爱的女主角,你不惜黑进了游戏的源代码。经过几天的努力,你终于找到了编码游戏中加恰系统的二进制字符串。为了解码它,您必须首先解决以下问题。

给你一个长度为 n n n的二进制字符串 s s s。对于每一对整数 ( l , r ) (l,r) (l,r) ( 1 ≤ l ≤ r ≤ n ) (1\leq l\leq r\leq n) (1lrn)中,数出 ( x , y ) (x,y) (x,y) ( l ≤ x ≤ y ≤ r ) (l\leq x\leq y\leq r) (lxyr)这样的整数对的个数。 ( l ≤ x ≤ y ≤ r ) (l\leq x\leq y\leq r) (lxyr) 0 \mathtt{0} 0的数量等于子串 s x s x + 1 . . . s y s_xs_{x+1}...s_y sxsx+1...sy 1 \mathtt{1} 1的数量。

输出所有可能的 ( l , r ) (l,r) (l,r) 1 0 9 + 7 10^9+7 109+7取模的结果。

分析:

题目表明 0 0 0 1 1 1数量相同,对于这类问题我们可以把 0 0 0设为 − 1 −1 1,从而把题目转换为区间和为 0 0 0的问题。对于区间和为 0 0 0的问题,先做一个前缀和,进而转换为两点前缀和相减为 0 0 0的问题,即两点前缀和一样。

然后考虑扫描线求解,固定 y y y端点,用 m a p map map维护所有 x x x端点对答案的贡献。对于区间 [ x , y ] [x,y] [x,y],它会被覆盖 x ( n − y + 1 ) x(n−y+1) x(ny+1)次。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int n;
LL a[N], sum[N];
char s[N];
map<LL, LL> mp;

void solve() {
    scanf("%s", s + 1);
    n = strlen(s + 1);
    mp.clear();
    LL ans = 0;
    mp[0] = 1;
    for (int i = 1; i <= n; i++) {
        a[i] = (s[i] == '1' ? 1 : -1);
        sum[i] = sum[i - 1] + a[i];
    }
    for (int i = 1; i <= n; i++) {
        ans = (ans + (n - i + 1) * mp[sum[i]] % mod) % mod;
        mp[sum[i]] += i + 1;
    }
    printf("%lld\n", ans);
}


int main() {
    LL t;
    scanf("%lld", &t);
    while (t--)
        solve();
    return 0;
}

F.Bomb(二分)

题意:

Sparkle给你两个长度为 n n n的数组 a a a b b b。最初,分数是 0 0 0。在一次操作中,可以选择一个整数 i i i并将 a i a_i ai添加到分数中。然后,必须设置 a i a_i ai= max ⁡ ( 0 , a i − b i ) \max(0,a_i-b_i) max(0,aibi)

在闪亮引爆核弹之前,只有时间进行 k k k次操作!在 k k k次操作后,能获得的最高分数是多少?

分析:

简单的想法是考虑贪心,我们使用优先队列维护 a a a数组每一个元素当前的值,每次操作取最大值即可。但是这样会超时,为了满足题目数据范围,我们对贪心的过程进行分析,由于每次取得数组的最大值,那么在 k k k次操作取完之后,必然存在一个分界线 x x x,使得所有分数 ⩾ x ⩾x x的全部被取到,分数恰好为 x − 1 x−1 x1的可能取到,分数 ⩽ x − 2 ⩽x−2 x2的不会被取到。

可以二分查找到这个分界线 x x x,直接取得 ⩾ x ⩾x x的分数,扣除得分次数以后剩下的再使用优先队列维护贪心。因为队列至多有 n n n个元素,而 b i ⩾ 1 b_i⩾1 bi1,所以分数恰好为 x − 1 x−1 x1的元素至多只有 n n n个,获取这些得分以后不会产生新的 x − 1 x−1 x1,所以使用优先队列维护贪心的复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),满足要求。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const LL N = 2e5 + 10;
LL n, k, a[N], b[N];

bool check(LL x) {
    LL t = 0;
    for (LL i = 1; i <= n; i++) {
        t += max(0ll, (a[i] - x) / b[i] + (a[i] >= x));
    }
    return t <= k;
}

LL getl() {
    LL l = 0, r = 1e9 + 1;
    while (l < r) {
        LL mid = l + r >> 1;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return l;
}

void solve() {
    cin >> n >> k;
    for (LL i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (LL i = 1; i <= n; i++) {
        cin >> b[i];
    }
    LL x = getl();
    LL res = 0;
    priority_queue<LL> q;
    for (LL i = 1; i <= n; i++) {
        LL c = max(0LL, (a[i] - x) / b[i] + (a[i] >= x));
        res += (2 * a[i] - (c - 1) * b[i]) * c / 2;
        k -= c;
        if (a[i] - c * b[i] >= 0) {
            q.push(a[i] - c * b[i]);
        }
    }
    while (k && !q.empty()) {
        LL v = q.top();
        q.pop();
        res += v;
        k--;
    }
    cout << res << endl;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell编程 --基础语法(1)

文章目录 Shell编程基础语法变量定义变量使用变量命令的使用只读变量删除变量 传递参数字符串获取字符串长度字符串截取 数组定义方式关联数组获取数组的长度 总结 Shell编程 Shell是一种程序设计语言。作为命令语言&#xff0c;它交互式解释和执行用户输入的命令或者自动地解…

数论——裴蜀定理、欧几里得算法、扩展欧几里得算法、逆元以及求解

裴蜀定理 若整数 a、b 互质&#xff08;最大公约数为 1&#xff09;&#xff0c;则存在整数 x、y &#xff0c;使得 ax by 1 。 更一般的情况是&#xff1a;设 a、b 是不全为零的整数&#xff0c;则存在整数 x、y &#xff0c;使得 ax by gcd(a, b) &#xff0c;其中 gcd…

第十一章:Kubernetes API服务器的安全防护

本章内容包括&#xff1a; 了解认证机制ServiceAccounts是什么及使用的原因了解基于角色(RBAC)的权限控制插件使用角色和角色绑定使用集群角色和集群角色绑定了解默认角色及其绑定 1 了解认证机制 在前面的内容中&#xff0c;我们说到API服务器可以配置一个到多个认证的插件(授…

等保2.0 | 人大金仓数据库测评

人大金仓数据库&#xff0c;全称为金仓数据库管理系统KingbaseES&#xff08;简称&#xff1a;金仓数据库或KingbaseES&#xff09;&#xff0c;是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。以下是关于人大金仓数据库的详细…

室内养宠空气净化器哪家好?热门室内养宠空气净化器用户体验

自从家里有了4只英短后&#xff0c;一到季节我就得不停的拖地刷床&#xff0c;除了这些可以手动清理的猫毛之外&#xff0c;那么空气中的猫毛怎么办&#xff1f;真的不建议养猫&#xff0c;除非你能接受空气中飞舞着浮毛&#xff0c;衣服、床、筷子、鼻子里全都是猫毛&#xff…

STM32——外部中断(EXTI)

目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断&#xff08;External Interrupt&#xff0c;简称EXTI&#xff09;是微控制器用于响应外部事件的一种方式&#xff0c;当外部事件发生时&#xff08;如按键按下、传感器信号…

NC 合并区间

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给出一组区间…

推流直播服务

pc端建立NVR服务器&#xff0c;并实现NVR功能&#xff0c;具有推流功能&#xff0c;推送给OBS&#xff0c;可以对接到抖音、快手等平台&#xff0c;实现实时直播&#xff0c;应用于无人值守&#xff0c;养殖、农场、旅游等场景 运行MediaServer和webserver 服务端口配置在confi…

C# 使用 NLog 输出日志到文件夹

在项目中使用 NuGet 安装 NLog 包以及 NLog.Config 包 配置 nlog.config 在项目的根目录下创建一个 Nlog.config 文件&#xff08;如果还没有&#xff09;&#xff0c;然后添加如下配置&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <…

leetcode数论(​3044. 出现频率最高的质数)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格&#xff0c;你可以按以下方式生成数字&#xff1a; 最多有 8 条路径可以选择&#xff1…

17 字符函数、字符串函数和内存函数

目录 一、字符函数 &#xff08;一&#xff09;字符分类函数 &#xff08;二&#xff09;字符转换函数 二、字符串函数 &#xff08;一&#xff09;strlen、strcpy、strcat、strcmp的使用和模拟实现 1、strlen &#xff08;1&#xff09;使用 &#xff08;2&#xff09;…

Java中的5种线程池类型

Java中的5种线程池类型 1. CachedThreadPool &#xff08;有缓冲的线程池&#xff09;2. FixedThreadPool &#xff08;固定大小的线程池&#xff09;3. ScheduledThreadPool&#xff08;计划线程池&#xff09;4. SingleThreadExecutor &#xff08;单线程线程池&#xff09;…

基于切片法计算点云体积 双向最近点三维点排序

具体内容源代码&#xff1a;基于切片法计算点云体积 双向最近点三维点排序 效果 主要方法&#xff1a; 点云切片&#xff08;基于一定厚度度的点云切片投影&#xff09; &#xff1b;切片后的点云分割 &#xff1b;边缘点排序【双向最近邻】&#xff08;可以进行多边形拟合计…

JAVA项目基于Spring Boot的美食烹饪互动平台的设计与实现

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网…

复盘:项目负责人的经验之谈

复盘&#xff1a;项目负责人的经验之谈 前言基础复盘&#xff1a;从无到有的自我觉醒客观分析&#xff1a;数据驱动的决策专业工具&#xff1a;科学分析的利器模型构建&#xff1a;从个案到普遍规律的提炼能力提升&#xff1a;从知识到行动的转变结语 前言 在项目管理和竞赛的世…

SOMEIP_ETS_002:数组长度过长

测试目的&#xff1a; 确保DUT在接收到的SOME/IP消息中数组长度超出实际数组长度时&#xff0c;能够返回错误消息。 描述 本测试用例旨在验证当DUT接收到一个声明数组长度超过其实际长度的SOME/IP消息时&#xff0c;DUT是否能够正确地返回错误消息&#xff08;MALFORMED_MES…

高并发下的分布式缓存 | 设计和实现LFU缓存

什么是 LFU 缓存&#xff1f; 最少使用频率 (LFU) 是一种用于管理计算机内存的缓存算法。在这种算法中&#xff0c;系统会跟踪缓存中每个数据被引用的次数。当缓存已满时&#xff0c;系统会删除引用频率最低的数据。 LFU 缓存问题描述 我们的目标是设计一个LFU 缓存&#xf…

手机号码归属地数据源,让您随时掌握通话对方位置!

手机号码归属地数据源&#xff0c;这是一个非常实用的数据源&#xff0c;可以帮助我们随时掌握通话对方的位置。无论是普通民众还是企业用户&#xff0c;都可以从中受益。 在这个数据源中&#xff0c;我们可以通过手机号码的前7位来查询该手机号码的归属地&#xff0c;包括省市…

美容院管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;服务类型管理&#xff0c;产品服务管理&#xff0c;预约信息管理&#xff0c;产品分类管理&#xff0c;产品信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包…

笔试练习day2

目录 BC64 牛牛的快递题目解析解法模拟代码方法1方法2 DP4 最小花费爬楼梯题目解析解法动态规划状态表示状态转移方程代码 数组中两个字符串的最小距离题目解析解法方法1暴力解法(会超时)方法2贪心(动态规划)代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接…