Codeforces Round 942 (Div.1) (Div. 2) 2A~2D

news2024/11/25 21:25:40

2A.Contest Proposal(枚举)

题意:

一个竞赛包含 n n n个问题,第 i i i个问题的难度预计最多 b i b_i bi。现在已经有 n n n个问题提案,第 i i i个问题的难度为 a i a_i ai。最初, a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1,b2,,bn都是按非递减顺序排序的。

有些问题可能比预期的更难,因此作者必须提出更多的问题。当提出难度为 w w w的新问题时,最难的问题将从竞赛中删除,问题将以难度不递减的方式排序。

换句话说,在每次操作中,你都要选择一个整数 w w w,将其插入数组 a a a中,对数组 a a a进行非递减排序,并从中删除最后一个元素。

求使对于所有 i i i都有 a i ≤ b i a_i\le b_i aibi的的最小新问题数。

分析:

因为选的 w w w一定可以让它合法,一次操作可以看作 a a a数组向右平移一位。遍历 a a a数组中每个数和第一个比 b b b数组小的差值,取最大值即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const LL N = 105;
LL a[N], b[N];

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, ans = 0, flag = 0;
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> b[i];
        }
        for (int i = 0; i < n; i++) {
            flag = 0;
            for (int j = i; j < n; j++) {
                if (a[i] <= b[j]) {
                    ans = max(j - i, ans);
                    flag = 1;
                    j = n;
                }
            }
            if (flag == 0) {
                ans = max(n - i, ans);
            }
        }
        cout << ans << endl;
    }
    return 0;
}

2B.Coin Games(博弈)

题意:

桌子上有 n n n枚硬币围成一个圆圈,每枚硬币要么朝上,要么朝下。爱丽丝和鲍勃轮流玩下面的游戏,爱丽丝先玩。

在每次操作中,玩家选择一枚正面朝上的硬币,取出硬币并翻转与其相邻的两枚硬币。如果(操作前)只剩下两枚硬币,则取出一枚,另一枚不翻转(因为会翻转两次)。如果(操作前)只剩下一枚硬币,则不会翻转任何硬币。如果(操作前)没有正面朝上的硬币,玩家就输了。

如果两人都以最佳方式下棋,谁会赢呢?可以证明,游戏将在有限次的操作中结束,其中一人将获胜。

分析:

U U U视作 1 1 1,将 D D D视作 0 0 0,一次操作就是拿走一个 1 1 1,将两侧分别异或 1 1 1

观察样例,猜测 U U U有奇数个先手赢,反之后手赢。

证明:根据上述转化,判定条件等价于判断全局异或和为 0 0 0还是为 1 1 1。一次操作对全局异或和的影响是将其与 1 1 1进行异或。

初始异或和为 1 1 1时,先手必定可以操作,到后手时异或和为 0 0 0,后手可能可以操作,回到先手,异或和还是 1 1 1,必定可以操作。如此往复,只要后手能操作,先手必定可以操作。

另一种情况类似。

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    int cnt = 0;
    for (int i = 0; i < n; i++)
        if (s[i] == 'U')
            ++cnt;
    if (!cnt) {
        cout << "NO" << endl;
        return;
    }
    if (cnt & 1) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
}

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

2C1A.Permutation Counting(贪心)

题意:

你有一些卡片。每张卡片上都写着一个介于 1 1 1 n n n之间的整数:具体来说,从 1 1 1 n n n的每张 i i i,你们有 a i a_i ai张卡片,上面写着数字 i i i

还有一个商店,里面有无限量的各种类型的卡片。你有 k k k枚金币,因此你总共可以购买 k k k张新卡片,你所购买的卡片可以包含 1 1 1 n n n之间的任意整数。

购买新牌后,您要将所有牌重新排列成一行。重新排列的得分是长度为 n n n的(连续)子数组中 [ 1 , 2 , … , n ] [1,2,\ldots,n] [1,2,,n]的排列数。你能得到的最高分是多少?

分析:

贪心地考虑优先用 k k k买原本数量少的卡片,使每种卡片的最少数量尽可能大。

推导一下可以发现使答案尽可能大的结构是 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 1,2,3,4,1,2,3,4 1,2,3,4,1,2,3,4这样的排列。

计算贡献,假设最小值为 x x x,比 x x x大的有 y y y个,我们一定会把这 y y y个尽量往前放,让较小的 x x x利用充分,这样总共有 ( x − 1 ) n + 1 + y (x−1)n+1+y (x1)n+1+y个合法子段。

然后就是模拟,把 k k k尽量往数量少的分。使用差分维护即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;

void solve() {
    LL n, k;
    cin >> n >> k;
    vector<LL> a(n, 0);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    sort(a.begin(), a.end());
    vector<LL> dlt(n, 0);
    for (LL i = 0; i < n - 1; i++) {
        if (!k)
            break;
        LL x = (i + 1) * (a[i + 1] - a[i]);
        if (k >= x) {
            dlt[i] += a[i + 1] - a[i];
            k -= x;
        } else {
            LL d = k / (LL) (i + 1);
            for (LL j = 0; j <= i; j++)
                a[j] += d;
            k -= (i + 1) * d;
            for (LL j = i; j >= 0; j--)
                if (k) {
                    ++a[j];
                    --k;
                }
            break;
        }
    }
    LL sum = 0;
    for (LL i = n - 1; i >= 0; i--)
        sum += dlt[i], a[i] += sum;
    LL d = k / (LL) n;
    k -= n * d;
    for (LL i = n - 1; i >= 0; i--)
        a[i] += d;
    for (LL i = n - 1; i >= 0; i--)
        if (k) {
            ++a[i];
            --k;
        }
    LL res = 0;
    for (LL i = n - 1; i >= 0; i--)
        if (a[i] > a[0])
            ++res;
    cout << a[0] * n - n + 1 + res << endl;
}

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

2D1(1B1).Reverse Card (Easy Version)(数学)

题意:

给你两个正整数 n n n, m m m

请计算满足以下条件的有序数对 ( a , b ) (a,b) (a,b)的个数:

  • 1 ≤ a ≤ n 1\le a\le n 1an, 1 ≤ b ≤ m 1\le b\le m 1bm;
  • a + b a+b a+b b ⋅ gcd ⁡ ( a , b ) b\cdot\gcd(a,b) bgcd(a,b)的倍数。

分析:

g c d ( a , b ) gcd(a,b) gcd(a,b)一定是等于 b b b,问题转换为 ( a + b ) % ( b ∗ b ) = = 0 (a+b)\%(b*b)==0 (a+b)%(bb)==0

那么 a a a b b b的倍数一定成立,可以通过枚举 b b b来找 a a a

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    int n, m;
    cin >> n >> m;
    int ans = 0;
    for (int b = 1; b <= m; ++b) {
        ans += (n / b + 1) / b - (b == 1);
    }
    cout << ans << endl;
}

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

2D2(1B2).Reverse Card (Hard Version)(数学)

题意:

给你两个正整数 n n n, m m m

请计算满足以下条件的有序数对 ( a , b ) (a,b) (a,b)的个数:

  • 1 ≤ a ≤ n 1\le a\le n 1an, 1 ≤ b ≤ m 1\le b\le m 1bm;
  • b ⋅ gcd ⁡ ( a , b ) b\cdot\gcd(a,b) bgcd(a,b) a + b a+b a+b的倍数。

分析:

gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b)表示为 d d d。假设有 a = p d a=pd a=pd b = q d b=qd b=qd,那么我们知道 gcd ⁡ ( p , q ) = 1 \gcd(p,q)=1 gcd(p,q)=1.

( a + b ) ∣ ( b ⋅ gcd ⁡ ( a , b ) )    ⟺    ( p d + q d ) ∣ ( q d 2 )    ⟺    ( p + q ) ∣ ( q d ) (a+b)\mid(b\cdot\gcd(a,b))\iff(pd+qd)\mid(qd^2)\iff(p+q)\mid (qd) (a+b)(bgcd(a,b))(pd+qd)(qd2)(p+q)(qd)

已知 gcd ⁡ ( p + q , q ) = gcd ⁡ ( p , q ) = 1 \gcd(p+q,q)=\gcd(p,q)=1 gcd(p+q,q)=gcd(p,q)=1,所以是 ( p + q ) ∣ d (p+q)\mid d (p+q)d

我们还知道 p ≥ 1 , q ≥ 1 p\ge 1,q\ge 1 p1,q1,所以 p < d = a p ≤ n p p\lt d=\frac{a}{p}\le\frac{n}{p} p<d=papn,从而 p 2 < n p^2\lt n p2<n。同样,我们可以证明 q 2 < m q^2\lt m q2<m

所以 ( p , q ) (p,q) (p,q)的个数是 O ( n m ) = O ( n + m ) \mathcal O(\sqrt{nm})=\mathcal O(n+m) O(nm )=O(n+m)。我们可以枚举出 gcd ⁡ ( p , q ) = 1 \gcd(p,q)=1 gcd(p,q)=1的每个 ( p , q ) (p,q) (p,q),并计算出答案。需要 ( p + q ) ∣ d (p+q)\mid d (p+q)d,因此我们加上 ⌊ min ⁡ { ⌊ n p ⌋ , ⌊ m q ⌋ } p + q ⌋ \left\lfloor\frac{\min\{\lfloor\frac{n}{p}\rfloor,\lfloor\frac{m}{q}\rfloor\}}{p+q}\right\rfloor p+qmin{⌊pn,qm⌋}

时间复杂度: O ( ∑ n + ∑ m ) \mathcal O(\sum n+\sum m) O(n+m)

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main() {
    int t;
    cin >> t;
    while (t--) {
        ll n, m;
        cin >> n >> m;
        ll sq = sqrt(n) + 2, sqm = sqrt(m) + 2;
        vector bad(sq + 1, vector<bool>(sqm + 1, 0));
        for (ll i = 2; i <= min(sq, sqm); i++) {
            for (ll a = i; a <= sq; a += i) {
                for (ll b = i; b <= sqm; b += i) {
                    bad[a][b] = true;
                }
            }
        }
        ll ans = 0;
        for (ll a = 1; a * a <= n; a++) {
            for (ll b = 1; b * b <= m; b++) {
                if (bad[a][b]) continue;
                ans += min(n / (a + b) / a, m / (a + b) / b);
            }
        }
        cout << ans << endl;
    }
    return 0;
}

赛后交流

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

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

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

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

相关文章

为什么现在越来越多的人会选择陪诊

现在越来越多的人选择陪诊的原因有多方面。 首先&#xff0c;随着人口老龄化、医疗资源分配不均等问题的日益突出&#xff0c;许多老年人和病患在就医过程中面临诸多困难&#xff0c;如挂号、排队、取药等繁琐的手续和流程。陪诊服务能够为他们提供极大的便利&#xff0c;帮助…

spring模块(六)spring监听器(2)@EventListener

一、介绍 监听器的简化写法 二、原理 三、使用 Slf4j Component public class MyTask {EventListenerpublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent) {log.info("监听到 ContextRefreshedEvent...");}if…

[图解]DDD架构好简单我学会了-学会也没啥用

1 00:00:03,720 --> 00:00:05,920 内部共有&#xff0c;首先是内部的 2 00:00:08,150 --> 00:00:09,220 所以不能说什么 3 00:00:09,630 --> 00:00:10,730 不能跟外部连在一起 4 00:00:10,740 --> 00:00:15,280 比如说&#xff0c;功能架构&#xff0c;可以吗 …

使用Linux命令时,前面加sudo和不加有什么区别?

在使用cmake命令编译时&#xff0c;前面加上sudo和不加主要有以下区别&#xff1a; 权限&#xff1a; 使用sudo&#xff1a;当您在命令前加上sudo时&#xff0c;表示您以超级用户的权限执行该命令。这通常用于需要访问受限制的系统文件或执行需要更高权限的操作。不使用sudo&am…

Swift 字符串和字符

字符串和字符 一、字符串字面量1、多行字符串字面量2、字符串字面量的特殊字符3、扩展字符串分隔符 二、初始化空字符串三、字符串可变性四、字符串是值类型五、使用字符六、连接字符串和字符七、字符串插值八、Unicode1、Unicode 标量2、可扩展的字形群集 九、计算字符数量十、…

『ZJUBCA Collaboration』WTF Academy 赞助支持

非常荣幸宣布&#xff0c;浙江大学区块链协会收到WTF Academy的赞助与支持&#xff0c;未来将共同开展更多深度合作。 WTF Academy是开发者的Web3开源大学&#xff0c;旨在通过开源教育让100,000名开发者进入到Web3。截止目前&#xff0c;WTF开源教程在GitHub收获超15,000 ⭐&a…

五一假期Llama 3之魔改不完全攻略(Part 2)

2024年4月18日&#xff0c;Meta AI 正式宣布推出 Llama 3&#xff0c;这标志着开源大型语言模型&#xff08;LLM&#xff09;领域的又一重大进步。如同一颗重磅炸弹&#xff0c; Llama 3 以其卓越的性能和广泛的应用前景&#xff0c;预示着 AI 技术的新时代。 目前开源的是Lla…

H62410A dcdc 24V30V36V48V60V72V100V降压12V/5V1A 恒压电源芯片IC

DCDC 24V-30V-36V-48V-60V-72V-100V降压至12V/5V 1A恒压电源芯片IC的工作原理主要基于开关调节和PWM&#xff08;脉冲宽度调制&#xff09;控制。 首先&#xff0c;芯片内部通常包含一个高速开关&#xff0c;通常是一个MOSFET&#xff08;金属氧化物半导体场效应晶体管&#x…

MySQL·内置函数

目录 函数 日期函数 案例1&#xff1a;创建一张表&#xff0c;记录生日 案例2&#xff1a;创建一个留言表 案例3&#xff1a;请查询在2分钟内发布的帖子 字符串函数 案例1&#xff1a; 获取emp表的ename列的字符集 案例2&#xff1a;要求显示exam_result表中的信息&am…

XShell 无法连上 VirtualBox的系统问题排查

之前一直都是可以正常使用的&#xff0c;过了一段时间之后&#xff0c;我发现无法使用XShell连接我之前安装的Centos 系统了。 我在centos中ping windows的IP地址&#xff0c;是可以 ping 通的&#xff0c; 百度也可以 ping 通&#xff0c;但是在 windows 中 ping centos的IP地…

湘潭大学数据库作业题完整答案

作业一&#xff1a; 考虑如下所示的关系数据库。这些关系上适当的主码是什么&#xff1f; 职工&#xff08;姓名&#xff0c;街道&#xff0c;城市&#xff09; 工作&#xff08;姓名&#xff0c;公司名&#xff0c;工资&#xff09; 公司&#xff08;公司名&#xff0c;城市&a…

【时序大模型总结】学习记录(1)

1.TimeGPT-1 思路&#xff1a;在来自不同领域的大量数据上训练模型&#xff0c;然后对未见过的数据产生零样本的推断。 作者对TimeGPT进行了超过1000亿个数据点的训练&#xff0c;这些数据点都来自开源的时间序列数据。该数据集涵盖了广泛的领域&#xff0c;从金融、经济和天气…

卧式负压排渣放水器为煤矿添彩

拥有自己的一片小天地&#xff0c;让每个角落都充满生活的色彩。快来找到心仪的产品&#xff0c;为煤矿添彩&#xff01; 一、排渣放水器的概述&#xff1a; 负压自动排渣放水器的型号为FYPZ&#xff0c;FY指负压放水器中的负压&#xff0c;PZ指自动排渣&#xff0c;FYPZ的全称…

初学C++——C++基础、变量、字面量、常量、数据类型、类型转换、变量命名规则、开发环境配置

文章目录 简介C 语言的特性C 开发环境配置C 变量&#xff0c;字面量和常量C 变量变量命名规则 C 字面量C 常量 C 数据类型C 基本数据类型派生数据类型 C 类型转换隐式类型转换C 显式转换 简介 C 是一种静态类型的&#xff0c;自由形式的&#xff08;通常&#xff09;编译的&…

css浮动(float)

浮动&#xff08;Float&#xff09; 在CSS中是一个重要的布局技术&#xff0c;它允许元素向左或向右移动&#xff0c;其周围的元素会重新排列。当一个元素被设置为浮动时&#xff0c;它会脱离正常的文档流&#xff0c;这意味着它不再占据原本在文档流中的空间&#xff0c;而会尽…

会声会影下载免费中文版 会声会影2023破解 会声会影中文汉化补丁包 会声会影永久激活版序列号免费 会声会影安装使用教程

会声会影是加拿大Corel公司制作的一款功能强大的视频编辑软件&#xff0c;正版英文名&#xff1a;Corel VideoStudio&#xff0c;具有图像抓取和编修功能&#xff0c;可以抓取&#xff0c;转换MV、DV、V8、TV和实时记录抓取画面文件&#xff0c;并提供有超过100 多种的编制功能…

Atlassian 从历史传奇到云端创新,背后的秘密

前言 通过过去在职企业和现服务的咨询客户案例&#xff0c;我深刻领悟到团队协作、项目管理和变革管理的重要性。这种全方位的视角促使我深入研究了 Atlassian Cloud 系列产品与解决方案。凭借对协作的深刻理解和丰富的 Jira 项目管理实践&#xff0c;我不断探索如何以项目管理…

AVL Cruise与Simulink联合仿真(通过MATLAB DLL方式)

最近毕业设计需要用到AVL Cruise与Simulink进行联合仿真&#xff0c;分析汽车模型的经济性。下面介绍一下我所知的AVL Cruise与Simulink联合仿真的几种方式&#xff0c;它们各自的优缺点&#xff0c;以及DLL方式联合仿真的具体配置过程。我这里用的MATLAB软件版本是2021a&#…

数字人捕捉、建模与合成

在感知系统中&#xff0c;我们与外部合作者一起创建逼真的 3D 人类&#xff0c;其行为可以像虚拟世界中的真实人类一样。这项工作在今天有许多实际应用&#xff0c;并且对于元宇宙的未来至关重要。但是&#xff0c;在感知系统中&#xff0c;我们的目标是科学的——通过重现人类…

汽车灯罩一般都是用什么材质做的?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩一般都是用什么材质做的&#xff1f; 汽车灯罩一般使用的主要材质是聚碳酸酯&#xff08;PC&#xff09;和丙烯酸酯&#xff08;PMMA&#xff09;这两种塑料。这两种材料具有良好的透明性、耐候性和耐冲击性&#xff0c;因此非常适合用于汽车灯罩的制造。 聚碳酸酯&am…