【Codeforces Global Round 18】【题解A-C】

文章涉及计算建筑物高度数组的丑陋程度,探讨数组按位AND操作使之非零所需的最少操作数,以及算法和数据结构的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你认为建筑物的丑陋是最高和最短建筑物之间的高度差。形式上,丑陋被定义为 max(a)−min(a)

在任意天数之后,您可以达到的最小可能丑度是多少?

输入

第一行包含一个整数 t (1≤t≤1000)——测试用例的数量。然后是 t 个案例。

每个测试用例的第一行包含一个整数 n (2≤n≤100)——建筑物的数量。

每个测试用例的第二行包含 n 个空格分隔的整数 a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 1 0 7 ) a_1,a_2,…,a_n (1≤a_i≤10^7) a1​,a2​,…,an​(1≤ai​≤107)——建筑物的高度。

输出

对于每个测试用例,输出一个整数——建筑物的最小可能丑陋程度。

题解:


如果 max(a)−min(a) 严格大于 1,您可以分别对 max 和 min 应用操作,这使它们彼此更接近。 换句话说,它要么减小 max(a)−min(a) 要么保持不变。 这意味着答案总是≤1。 现在剩下的就是确定答案是 0 还是 1。如果数组的总和可以被 n 整除,那么答案只能是 0,因为数组的总和在一次运算之后不能改变,并且如果它不能被 n 整除 n 你不能让每个元素都相等。 这意味着如果总和可被 n 整除,则答案为 0,否则为 1。

code:


#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long double ld;

typedef pair<int,int> pii;

const int maxn=1e6+5;

void solve(){

int n;

cin >> n;

int a[1000] = {0};

int sum = 0;

int maxx = 0;

for (int i = 0; i < n;i++){

cin >> a[i];

sum += a[i];

}

if(sum%n==0)

cout << “0\n”;

else

cout << “1\n”;

}

int main(){

ios::sync_with_stdio(0);

int t;

cin >> t ;

while(t–){

solve();

}

return 0;

}

B. And It’s Non-Zero

=======================================================================================

题目描述


给定一个数组,其中包含 [l,r] 中的所有整数。例如,如果 l=2 且 r=5,则数组将为 [2,3,4,5]。为了使数组的按位 AND 非零,您可以删除的最小元素数是多少?

按位 AND 是一种二元运算,它采用两个等长的二进制表示,并对每对相应的位执行 AND 运算。

输入

第一行包含一个整数 t ( 1 ≤ t ≤ 1 0 4 ) t (1≤t≤10^4) t(1≤t≤104)——测试用例的数量。然后是 t 个案例。

每个测试用例的第一行包含两个整数 l l l 和 r ( 1 ≤ l ≤ r ≤ 2 ⋅ 1 0 5 ) r (1≤l≤r≤2⋅10^5) r(1≤l≤r≤2⋅105)——数组的描述。

输出

对于每个测试用例,输出一个整数——问题的答案。

inputCopy

5

1 2

2 8

4 5

1 5

100000 200000

outputCopy

1

3

0

2

31072

在第一个测试用例中,数组是 [1,2]。目前,按位与为 0,因为 1 & 2=0。但是,删除1(或2)后,数组变为[2](或[1]),按位AND变为2(或1)。可以证明这是最优的,所以答案是 1。

在第二个测试用例中,数组是 [2,3,4,5,6,7,8]。目前按位与为0,但删除4、5、8后,数组变为[2,3,6,7],按位与为2,可以证明这是最优的,所以答案是 3。请注意,可能还有其他方法可以删除 3 个元素。

题解:


让我们解决补码问题:找到数组的最大子序列,使得它们的按位 AND 非零。令 x 是最佳子序列的按位和。由于 x≠0,因此 x 中必须至少设置一位。让我们迭代那个位,称之为 b,并在每次迭代中计算最大的子序列,其按位和设置了该位。对于要在最终答案中设置的第 b 位,所选子序列中的每个元素都必须设置该位。由于选择第 b 位打开的每个元素都是有效的子序列,这意味着第 b 位的答案是设置了第 b 位的元素的数量。因此,最终问题的答案是 n − m a x 1 ≤ b ≤ 30 c n t b n−max_{1≤b≤30}cnt_b n−max1≤b≤30​cntb​,其中 c n t b cnt_b cntb​ 是设置了第 b 位的元素的数量。

注意:最终答案是否包含多个设置位并不重要,它仍然包含在至少一种情况下,并且按位和仍然是非零的。

剩下的就是对所有 b 设置第 b 位的 [l…r] 范围内的元素数量进行计数。这可以通过预计算来完成,通过在回答任何测试用例之前创建 b 个前缀和数组,其中第 b 个数组的第 i 个元素是具有第 b 个位的整数 ≤i 的数量。在此之后,您可以使用前缀和技术来回答查询,如 c n t b = a b , r − a b , l cnt_b=a_{b,r}−a_{b,l} cntb​=ab,r​−ab,l​,如果 a b a_b ab​ 是第 b 个数组。

挑战:解决 1 ≤ l ≤ r ≤ 1 0 9 1≤l≤r≤10^9 1≤l≤r≤109的问题。

code:


#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long double ld;

typedef pair<int,int> pii;

const int maxn=1e6+5;

ll sum[maxn][20];

void solve(){

int l, r;

cin >> l >> r;

ll res = 0x3f3f3f;

for (int i = 0; i <= 18;i++){

ll temp = sum[r][i] - sum[l - 1][i];

res = min(res, temp);//最小就是要删掉的

}

cout << res << endl;

}

int main(){

ios::sync_with_stdio(0);

int t;

cin >> t ;

for (int i = 0; i <= 2e5;i++){

for (int j = 18; j >= 0;j–){

if(!((i>>j)&1))

sum[i][j] = sum[i - 1][j] + 1;

else

sum[i][j] = sum[i - 1][j];

}

}

while (t–)

{

solve();

}

return 0;

}

C. Menorah

=============================================================================

题目详情


光明节烛台上有 n 根蜡烛,其中一些蜡烛最初是点燃的。我们可以用二进制字符串 s 来描述哪些蜡烛被点燃,其中第 i 根蜡烛被点燃当且仅当 s i = 1 s_i=1 si​=1。

最初,蜡烛灯由字符串 a 描述。在操作中,您选择当前点亮的蜡烛。通过这样做,您选择的蜡烛将保持点亮状态,而其他所有蜡烛都会改变(如果它被点亮,它将熄灭,如果它未被点亮,它将被点亮)。

您想让蜡烛看起来与字符串 b 相同。您的任务是确定是否可行,如果可行,则找出所需的最少操作次数。

输入

第一行包含一个整数 t ( 1 ≤ t ≤ 1 0 4 ) t (1≤t≤10^4) t(1≤t≤104)——测试用例的数量。然后是 t 个案例。

每个测试用例的第一行包含一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n (1≤n≤10^5) n(1≤n≤105) — 蜡烛的数量。

第二行包含一个长度为 n 的字符串 a,由符号 0 和 1 组成——灯光的初始模式。

第三行包含一个长度为 n 的字符串 b,由符号 0 和 1 组成——所需的灯光模式。

保证n之和不超过 1 0 5 10^5 105。

输出

对于每个测试用例,输出将 a 转换为 b 所需的最少操作数,如果不可能,则输出 -1。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

[外链图片转存中…(img-x7aliqms-1713522633187)]

[外链图片转存中…(img-ZllmMBUc-1713522633189)]

[外链图片转存中…(img-dAzyhlb0-1713522633191)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值