USACO 2024年1月比赛 铜组题解

洛谷P10133 [USACO24JAN] Balancing Bacteria B 【题目解析】&【一阶差分】&【二阶差分】 阅读详情


比赛链接:http://usaco.org/

第一题:MAJORITY OPINION

标签:思维、模拟
题意:给定一个长度为 n n n的序列 a a a,操作:若区间 [ i , j ] [i,j] [i,j]内某个数字 k k k出现的次数 大于区间长度的一半,可以将区间内的所有数都换成这个数 k k k。经过多次操作之后,让区间 [ 1 , n ] [1,n] [1,n]内都为同一个数,输出所有可能的数(按照数字递增的顺序),若没有输出 − 1 -1 −1。( 1 < = n < = 1 0 5 , 1 < = a i < = n 1<=n<=10^5,1<=a_i<=n 1<=n<=105,1<=ai​<=n)
题解:连续两个相同的数,不管是往前还是往后一个,都可以把加进来的数变成区间内的这个数。
比如 x   y   y   z x\ y \ y \ z x y y z可以往前把 x x x变成 y y y,往后把 z z z变成 y y y,那其实再往前或者再往后 可以把所有数都变成 y y y。
除此之外,还有 y   x   y y \ x\ y y x y的情况也是满足条件的,先把中间的这个 x x x变成 y y y,然后也可以把所有数都变成 y y y。

最终就变成了求第 i i i数和 第 i − 1 i-1 i−1个数或者第 i − 2 i-2 i−2个数 是否相同,相同的话,就可以去作为我们的答案,当然可能有重复的情况,所以要去重输出。
代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int t, n, a[N], res[N];

int main() {
    cin >> t;
    while (t--) {
        cin >> n;
        int c = 0;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            if (i >= 2 && a[i] == a[i - 1]) res[++c] = a[i];
            else if (i >= 3 && a[i] == a[i - 2]) res[++c] = a[i];
        }
        sort(res + 1, res + 1 + c);
        c = unique(res + 1, res + 1 + c) - res - 1;
        if (c == 0) cout << -1 << endl;
        else {
            for (int i = 1; i < c; i++) {
                cout << res[i] << " ";
            }
            cout << res[c] << endl;
        }
    }
    return 0;
}

第二题:CANNONBALL

标签:模拟
题意:给定一个从左往右 1 , 2 , . . . , N 1,2,...,N 1,2,...,N标记的数轴,从其中某个位置 S S S开始往右跳,初始能量为 1 1 1。如果当前能量为 k k k,将会从当前位置往前跳 k k k的距离。
每个标记的位置,要么是跳板,要么是靶子,每个位置都有值 v i v_i vi​。
跳板:跳到跳板上,当这个位置的值是 v i v_i vi​,当前能量会增加 v i v_i vi​,并反转跳的方向。
靶子:跳到靶子上,如果当前能量大于等于 当前位置的值 v i v_i vi​,将会打破靶子,靶子被破坏掉后,将会一直维持破坏的状态,下次跳到这个位置无法被打破。
假设可以跳无限长的时间,或者离开数轴位置,能打破多少个靶子?( 1 < = N < = 1 0 5 1<=N<=10^5 1<=N<=105)
题解:维持当前朝向 d i r dir dir,当前能量 e n e r g y energy energy,模拟跳的过程,当跳的过程中 s < 1 s<1 s<1或者 s > n s>n s>n结束。每次按照规则进行模拟跳,跳板的时候增加能量值,反转跳的方向,打靶的时候标记一下靶子是否被破坏过。

如果在同一个能量值跳到 某个位置 两次,那么可以得到以后的循环不会有新的靶子被破坏,再之后就是重复新的一轮了。小估估一下时间复杂度,让它尽量跳,超出轮数默认不会再产生新的打破靶子数。
代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int n, s, q[N], v[N], ans = 0;
bool vis[N];

int main() {
    cin >> n >> s;
    for (int i = 1; i <= n; i++) {
        cin >> q[i] >> v[i];
    }
    int energy = 1, dir = 1; // 能量、朝向
    for (int i = 1; i <= 1000 * N; i++) {
        if (q[s] == 0) { // 跳板
            energy += v[s];
            dir *= -1;
        }
        else { // 靶子
            if (!vis[s] && energy >= v[s]) {
                vis[s] = 1;
                ans++;
            }
        }
        s += dir * energy;
        if (s < 1 || s > n) break;
    }
    cout << ans << endl;
    return 0;
}

第三题:BALANCING BACTERIA

标签:思维、差分
题意:给定 n n n个数, a 1 , a 2 , a 3 . . . a n a_1,a_2,a_3...a_n a1​,a2​,a3​...an​,每次操作 可以选择数字 L ( 1 < = L < = n ) L(1<=L<=n) L(1<=L<=n),并选择增加或者减少。
比如增加的情况,从第 n n n个数开始,第 n n n个数增加 L L L,第 n − 1 n-1 n−1个数增加 L − 1 L-1 L−1,第 n − 2 n-2 n−2个数增加 L − 2 L-2 L−2…,依次类推,直到增加值为 0 0 0,再往前就不增加(即第 1 1 1个到第 n − L n-L n−L个数不增加值)
求将所有数变成 0 0 0的最少操作次数。( 1 < = n < = 2 ∗ 1 0 5 , 1 0 − 15 < = a i < = 1 0 15 1<=n<=2*10^5,10^{-15}<=a_i<=10^{15} 1<=n<=2∗105,10−15<=ai​<=1015)

举个例子:比如有两个数 − 1     3 -1\ \ \ 3 −1   3
可以先从选择数字 L = 1 L=1 L=1并进行减少,操作 5 5 5次,把序列变成: − 1      − 2 -1\ \ \ \ -2 −1    −2
然后选择数字 L = 2 L=2 L=2,并进行增加,操作 1 1 1次,把序列变成: 0     0 0\ \ \ 0 0   0。总共 6 6 6次操作。
题解:以样例 2 2 2为例,有 5 5 5个数: 1     3    − 2    − 7     5 1\ \ \ 3 \ \ -2 \ \ -7 \ \ \ 5 1   3  −2  −7   5
我们维护一个差分数组 b i b_i bi​为 a i − a i − 1 a_i-a_{i-1} ai​−ai−1​: 1     2    − 5    − 5     12 1\ \ \ 2 \ \ -5 \ \ -5 \ \ \ 12 1   2  −5  −5   12
这个差分数组表示原 a a a数组中相邻两个数的差值,我们额外对 i = 1 i=1 i=1的时候求 b 1 = a 1 − a 0 b_1=a_1-a_0 b1​=a1​−a0​, a 0 = 0 a_0=0 a0​=0。
再对差分数组 b i b_i bi​做差分, c i = b i − b i − 1 c_i=b_i-b_{i-1} ci​=bi​−bi−1​: 1    1    − 7    0    17 1 \ \ 1 \ \ -7 \ \ 0 \ \ 17 1  1  −7  0  17

原 a i a_i ai​: 1     3    − 2    − 7     5 1\ \ \ 3 \ \ -2 \ \ -7 \ \ \ 5 1   3  −2  −7   5
第 1 1 1轮 a i a_i ai​: − 1   − 2   − 3   − 4   − 5 = > 0     1    − 5    − 11     0 -1\ -2\ -3\ -4 \ -5=> 0\ \ \ 1 \ \ -5 \ \ -11 \ \ \ 0 −1 −2 −3 −4 −5=>0   1  −5  −11   0 (操作次数 + 1 +1 +1)
第 2 2 2轮 a i a_i ai​: 0   − 1   − 2   − 3   − 4 = > 0     0    − 7    − 14     − 4 0\ -1\ -2\ -3 \ -4=> 0\ \ \ 0 \ \ -7 \ \ -14 \ \ \ -4 0 −1 −2 −3 −4=>0   0  −7  −14   −4 (操作次数 + 1 +1 +1)
第 3 3 3轮 a i a_i ai​: 0   0   1   2   3 = > 0     0    0    0     17 0\ 0\ 1\ 2 \ 3=> 0\ \ \ 0 \ \ 0 \ \ 0 \ \ \ 17 0 0 1 2 3=>0   0  0  0   17 (操作次数 + 7 +7 +7)
第 4 4 4轮 a i a_i ai​: 0   0   0   0   0 = > 0     0    0    0     17 0\ 0\ 0\ 0 \ 0=> 0\ \ \ 0 \ \ 0 \ \ 0 \ \ \ 17 0 0 0 0 0=>0   0  0  0   17 (操作次数 + 0 +0 +0)
第 5 5 5轮 a i a_i ai​: 0   0   0   0   − 1 = > 0     0    0    0     0 0\ 0\ 0\ 0 \ -1=> 0\ \ \ 0 \ \ 0 \ \ 0 \ \ \ 0 0 0 0 0 −1=>0   0  0  0   0 (操作次数 + 17 +17 +17)

我们能够发现每次归 0 0 0的操作次数就是对应 c i c_i ci​的绝对值。其实就是对 b i b_i bi​进行差分,得到每个对应的后缀需要修改多少。
代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
typedef long long ll;
ll a[N], b[N], n, ans = 0;

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        b[i] = a[i] - a[i - 1]; // 差分
    }
    for (int i = 1; i <= n; i++) {
        ans += abs(b[i] - b[i - 1]);
    }
    cout << ans << endl;
    return 0;
}
USACO 2024 Open Bronze铜组题解 阅读详情

相关推荐

MATLAB锂离子电池伪二维(P2D)模型实现

锂离子电池伪二维(P2D)模型的MATLAB实现。该模型基于Newman等人提出的经典电化学模型,考虑了固液相扩散、电荷守恒和电化学反应动力学。

hie98894的博客 1927

USACO 2024年1月铜组 BALANCING BACTERIA(思维、差分)

USACO 2024年1月比赛 铜组 BALANCING BACTERIA

超哥聊信奥 2042

如何使用windows搭建一个公网ftp/sftp服务器

在有公网ip的情况下,使用windows系统搭建一个ftp/sftp服务器会带来很多的方便,可以实现远程移动端的一键式访问,对于文件的备份、多设备的共享都十分的方便。然而网上许多的教程都是基于windows自带的iis搭建一个局域网ftp服务器,然而在搭建好后,我想要通过端口映射的方式实现在外网访问时,却发现连接不上的问题,感觉可能是因为windows家庭版的原因导致的。因此在查阅很多资料之后终于找到了一个公网ftp/sftp服务器的搭建方式,实测可用。这里把流程记录一下,做一个备忘录,也方便大家搭建。

weixin_43354138的博客 1万+

USACO 2024年1月铜组 MAJORITY OPINION(思维 模拟)

USACO 2024年1月铜组 MAJORITY OPINION

超哥聊信奥 1166

宏基因组分析|从Binning到MAG优化的全流程实战指南

本文提供了一份宏基因组分析从Binning到MAG优化的全流程实战指南。详细解析了宏基因组分箱(Binning)的核心原理与必要性,并手把手指导如何利用Bowtie2、MetaBAT2和CheckM等工具构建分箱流水线,进行质量评估与筛选,最终获得高质量宏基因组组装基因组(MAG)。文章还分享了常见问题排查与进阶优化策略,为后续物种分类、功能注释等深度分析奠定坚实基础。

weixin_29260291的博客 451

如何用Lmcache+vllm优化KVcache存储?CPU与SSD性能实测对比

本文通过实测对比,详细介绍了如何利用Lmcache+vLLM将大模型推理中的KV Cache卸载至CPU内存或SSD硬盘,以解决长上下文场景下的GPU显存瓶颈。测试数据显示,CPU卸载方案在首字延迟(TTFT)上显著优于SSD方案,但SSD方案在存储成本上更具优势。文章提供了完整的配置指南、性能数据分析和生产环境选型建议。

fire9的博客 984

[USACO] 202401B1 Majority Opinion

Farmer John 有一项重要的任务——弄清楚要为他的奶牛们购买什么类型的干草。Farmer John 的 N 头奶牛(2≤N≤105^2)编号为 11 到 N,每头奶牛喜欢恰好一种类型的干草 hi(1≤hi≤N1)。他希望他的所有奶牛都喜欢同一种干草。为了实现这一目标,Farmer John 可以主持焦点小组访谈。一次焦点小组访谈为让编号从 i 到 j 的连续范围内的所有奶牛聚集在一起参加一次访谈。如果有一种干草是小组中超过一半的奶牛喜欢的,则此次焦点小组访谈结束后,所有奶牛最终都会喜欢这种干草。

QWQFAE233的博客 1754

luks-磁盘加密工具

linux磁盘加密配置工具及步骤详解

zdd56789的博客 120

[USACO24JAN]2024一月铜组1,3题题解

[USACO24JAN]2024一月铜组1,3题题解

m0_60958303的博客 2446

全局–局部傅里叶神经算子(GL-FNO):原理、严格推导与 PINN 混合策略

本文提出了一种全局-局部傅里叶神经算子(GL-FNO)及其与物理信息神经网络(PINN)的结合方法。主要内容包括: 架构设计:GL-FNO包含两个分支 - 全局分支处理低频结构,使用下采样输入;局部分支处理高频细节,使用全分辨率输入。两分支通过自适应门控机制融合。 理论分析:证明了GL-FNO在"低频全局+高频局部"任务上的优势,给出了误差分解和复杂度分析,并推导了与PINN结合时的渐进一致性条件。 实现方法:采用频谱微分计算物理残差,推导了完整的训练流程,包括数据损失与物理损失的联合优

VectorShift的博客 1330

亚马逊跨境电商选品数据分析:Python爬虫实战指南

本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。

2201_76125261的博客 299

USACO学习与比赛(2024.12.05)

USACO学习与比赛(2024.12.05)

青少年趣味编程 1362

如何在非序列模式下使用类似图像模功能

如何在非序列模式下使用类似图像模功能

weixin_72050316的博客 552

USACO 铜级

参赛资格:注册USACO账号即为铜级难度等级:铜级考试相对简单,参赛学生需会至少一种程序语言,只要经过一定的训练,大部分初次参赛的选手都能在限制时间内做完题,在第一次考试中晋级白银级。 USACO(美国信奥赛)2022年1月青铜组题目详解 USACO(美国信奥赛)2022年1月青铜组题目详解_哔哩哔哩_bilibili 2022.1青铜组解析 2022.1青铜组解析_哔哩哔哩_bilibili USACO 2022 一月铜组题解 第三题 Drought USACO 2022 一月铜组

青少年趣味编程 1849

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

USACO历年白银组真题解析 | 汇总

我把自己练习过的USACO的题目都整理了一下。虽然网站上有许多高手的解法,但因为我自己也是初学者,所以只用了比较容易理解的方法来分析和解答。如果你也在学习的话,希望这些内容能对你有一点帮助。

团爸讲算法 1833

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

题解 | #[USACO 2009 Dec S]Music Notes#

我目前是暑期前端实习生初试通过了,等待复试通知的阶段,但搜了一会儿发现有的人二面问的问题是关于对公司。-- “同一时刻有进入有离开时,先记录增加后记录减少” ,进入+1,退出-1,可以使用sum窗口函数。211硕研二,之前跟着导师做cv的一个小众方向,现在和我说推荐我去他朋友的一家中厂做大模型相关工作,本人bg本2硕9,目前研一,在某大厂实习做AIGC相关,我学长说这个做好了可以投搜广推或算法的工程岗。【顺丰科技】2024届校园招聘来啦,3月是最缺简历的时候,不限学校,不限学历,抓紧投递!

2301_79125431的博客 1834

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

USACO竞赛2026赛季前瞻与算法备赛指南

算法竞赛是检验计算机科学能力的重要途径,其核心在于运用数据结构与算法解决复杂问题。动态规划、图论等基础算法通过时间复杂度优化和空间效率提升展现技术价值,广泛应用于路径规划、资源调度等场景。USACO作为国际权威赛事,其2025-2026赛季将重点考察动态规划进阶、图论综合应用等方向,选手需掌握STL容器优化、BFS模板等实用技巧。备赛过程中,算法题库训练和调试技巧尤为关键,如使用ios::sync_with_stdio(false)提升IO效率,这些方法同样适用于工程实践中的性能优化。

weixin_32822843的博客 140

博客更新日志 & 闲话

XH & upd

seanli1008的博客 428

洛谷 P10131 Majority Opinion B 题解

为了让所有奶牛都喜欢一种干草,Farmer John 会随意选中一个范围的奶牛组成一个小组,如果有一种干草是小组中超过一半的奶牛喜欢的,那么这个小组所有牛都会喜欢这种干草。头奶牛就可以都喜欢一种干草了,此时我们再一次多框入少于之前小组数量的奶牛组成新的小组多次,就可以使一种干草覆盖整个序列。如果没有任意连续三头牛中两个有相同的喜好,那么无论怎么进行分组都不可能符合超过半数的奶牛有相同喜好。最后,我用的桶来解决的,因为可以去重,排序。头奶牛组成的小来看,不难发现,只要有。头喜欢一种干草的所有情况。

lcz的博客 1062

Luogu P10131 [USACO24JAN] Majority Opinion B题解

【代码】Luogu P10131 [USACO24JAN] Majority Opinion B题解。

weixin_41727047的博客 837

打卡信奥刷题(788)用C++信奥P10131[普及组/提高] [USACO24JAN] Majority Opinion B

Farmer John 有一项重要的任务——弄清楚要为他的奶牛们购买什么类型的干草。Farmer John 的N头奶牛(2≤N≤105)编号为1到N,每头奶牛喜欢恰好一种类型的干草hi​1≤hi​≤N他希望他的所有奶牛都喜欢同一种干草。为了实现这一目标,Farmer John 可以主持焦点小组访谈。一次焦点小组访谈为让编号从i到j的连续范围内的所有奶牛聚集在一起参加一次访谈。

Loge谈信奥--一个专注于信奥人的博客 4933
上一篇: 【每日一题】洛谷 P2014:选课(有依赖背包)
下一篇: 上海计算机学会1月月赛 丙组题解
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值