AtCoder Beginner Contest 330 A~F

A.Counting Passes(暴力)

题意:

给定 n n n个学生的分数,以及及格分 x x x ,问多少人及格了。

分析:

暴力枚举,依次判断每个学生的分数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){int n, l;cin >> n >> l;int ans = 0;while (n--) {int x;cin >> x;ans += (x >= l);}cout << ans << endl;return 0;
}

B.Minimize Abs 1(数学)

题意:

回答 n n n 个问题,每个问题给定 a , l , r a,l,r a,l,r,问函数 f ( x ) = ∣ x − a ∣ f(x)=|x−a| f(x)=xa [ l , r ] [l,r] [l,r]的最小值。

分析:

全定义域下,最小值显然在 x = a x=a x=a 取得。绝对值函数图像是 V V V 型。
现在定义域限定在 [ l , r ] [l,r] [l,r],则分 a ≤ l , a ≥ r , l < a < r a \le l,a \ge r,l \lt a \lt r al,ar,l<a<r 三种情况分别讨论极值即可。即分别在 x = l , x = r , x = a x=l,x=r,x=a x=l,x=r,x=a取得最小值。

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){int n, l, r;cin >> n >> l >> r;while (n--) {int a;cin >> a;if (a <= l)cout << l << ' ';else if (a >= r)cout << r << ' ';elsecout << a << ' ';}return 0;
}

C.Minimize Abs 2(数学)

题意:

给定整数 d d d,问函数 f ( x , y ) = ∣ x 2 + y 2 − d ∣ f(x,y)=|x^2+y^2−d| f(x,y)=x2+y2d的最小值。

分析:

枚举 x x x的取值,范围是 [ 1 , 2 e 6 ] [1,2e6] [1,2e6],然后得 y 2 = a b s ( d − x ∗ x ) y^2=abs(d−x∗x) y2=abs(dxx),分别取 y 1 = ⌊ y ⌋ , y 2 = ⌈ y ⌉ y_1=\lfloor\sqrt{y}\rfloor,y_2=\lceil\sqrt{y}\rceil y1=y ,y2=y ,由于会有一正一负的情况 ( x 2 + ( y 1 ) 2 ≤ d , x 2 + ( y 2 ) 2 ≥ d ) (x^2+(y_1)^2 \le d,x^2+(y_2)^2 \ge d) (x2+(y1)2d,x2+(y2)2d),取 m i n ( f ( x , y 1 ) , f ( x , y 2 ) ) min(f(x,y1),f(x,y2)) min(f(x,y1),f(x,y2)),对所有 x x x 取最小值即可。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){LL d;cin >> d;int up = 2e6;LL ans = 1e18;for (int i = 0; i <= up; ++i){LL x = 1ll * i * i;LL y = abs(d - x);LL y1 = floor(sqrt(y)), y2 = ceil(sqrt(y));ans = min({ans, abs(x + y1 * y1 - d), abs(x + y2 * y2 - d)});}cout << ans << endl;return 0;
}

D.Counting Ls(思维,枚举)

题意:

给定一个包含o或者x的二维矩阵。问所有满足下述条件的三元组下标数量。

  • 该三元组上的字符在矩阵中的位置各不相同,但是都是o
  • 该三元组中,其中两个字符在同一行,其中两个字符在同一列。

分析:

如果二维矩阵的一个位置的字符为o时,该字符可以作为中间点产生的贡献为 ( r o w [ i ] − 1 ) ∗ ( c o l [ j ] − 1 ) (row[i]-1)*(col[j]-1) (row[i]1)(col[j]1),其中 r o w [ i ] row[i] row[i]表示该行o的个数, c o l [ i ] col[i] col[i]表示该列 o 的个数。累计这些答案计数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;string s[2005];
int row[2005], col[2005];int main(){int n;cin >> n;for (int i = 0; i < n; i++) {cin >> s[i];for (int j = 0; j < n; j++) {if (s[i][j] == 'o') {row[i]++;col[j]++;}}}LL ans = 0;for (int i = 0; i < n; ++i)for (int j = 0; j < n; ++j) {if (s[i][j] == 'o') {ans += 1ll * (row[i] - 1) * (col[j] - 1);}}cout << ans << endl;return 0;
}

E.Mex and Update(思维,数据结构)

题意:

给定一个数组 a a a,进行如下操作。每次操作令 a i = x a_i=x ai=x。然后输出 m e x ( a ) mex(a) mex(a)

m e x ( a ) mex(a) mex(a)表示数组 a a a未出现的最小非负整数

分析:

考虑如何求出一个数组的 m e x mex mex,我们可以用一个 m a p map map表示数字 i i i的出现次数,那每次求 m e x mex mex可以从小到大遍历该数组,找到第一个出现次数为 0 0 0的下标即是答案。

但这复杂度可能会高达 O ( n ) O(n) O(n),考虑更快速的方法,我们可以用 s e t set set储存 m a p map map中值为 0 0 0(未出现的数)下标,这样 s e t set set中的最小值就是答案。

a i = x a_i=x ai=x时,相当于把原来的 a i a_i ai删掉,即 m p [ a i ] mp[a_i] mp[ai]−−,然后把 x x x加进来,即 m p [ x ] mp[x] mp[x]++,如果 m p [ a i ] mp[a_i] mp[ai]变为 0 0 0,则说明 a i a_i ai没有出现,将其插入到 s e t set set中。同时 m p [ x ] mp[x] mp[x]变为 1 1 1,说明 x x x出现了,从 s e t set set中删去。

这样就可以动态维护 m e x mex mex值,此时的每次操作的时间复杂度为 O ( l o g n ) O(logn) O(logn)

hint:

  • 包含 n n n个数的数组可能的 m e x mex mex 0 ∼ n 0 \sim n 0n

  • s e t set set可以通过 b e g i n ( ) begin() begin()方法取出头部元素的迭代器,然后通过解地址符*取出对应的值。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int a[200005];
map<int, int> mp;
set<int> mex;
int main(){int n, q;cin >> n >> q;for (int i = 1; i <= n; ++i){cin >> a[i];mp[a[i]]++;}for (int i = 0; i <= n; ++i){if (mp[i] == 0){mex.insert(i);}}while (q--){int i, x;cin >> i >> x;if (mp[a[i]] == 1){mex.insert(a[i]);}mp[a[i]]--;if (mp[x] == 0){mex.erase(x);}mp[x]++;a[i] = x;cout << *mex.begin() << endl;}
}

F.Minimize Bounding Square(二分,前缀和)

题意:

二维平面上 n n n个点,可进行最多 k k k 次操作,每次操作将一个点上下左右移动一格。点可以重叠。问进行若干次操作后,能将所有点覆盖的正方形的边长的最小值。

分析:

x x x y y y两个维度相互独立,我们可以分别考虑每个维度。

考虑一维情况下,如果我们固定覆盖的线段长度,会发现比较好做。注意到如果边长越大,我们需要的移动次数越少,可行的可能性就越高,相反,边长越小,需要移动的次数越多,可行的可能性就越低。

这里有一个单调性,因此我们可以二分最终的边长。问题转化为给定数轴上 n n n个点,可以在数轴上放置一个区间,要求所有点到达区间内的最小移动距离,若该区间是一个点,则是一个经典问题,取中位数即可。

此题中不难发现最优选法区间的左端点或者右端点一定是其中某个点,可以枚举所有情况然后利用二分与前缀和去优化计算距离

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
LL k;
const int maxn = 2e5 + 5;
LL x[maxn], y[maxn], sx[maxn], sy[maxn];
LL calc(LL *p, LL *s, int mid){LL res = 1e18;for (int i = 1; i <= n; i++){LL v = 1ll * i * p[i] - s[i];int R = p[i] + mid;int l = 1, r = n;while (l < r){int mid = l + r >> 1;if (p[mid] > R)r = mid;elsel = mid + 1;}if (p[r] > R)v += s[n] - s[r - 1] - 1ll * (n - r + 1) * R;res = min(res, v);}for (int i = n; i; i--){LL v = s[n] - s[i - 1] - 1ll * (n - i + 1) * p[i];int L = p[i] - mid;int l = 1, r = n;while (l < r){int mid = l + r + 1 >> 1;if (p[mid] < L)l = mid;elser = mid - 1;}if (p[r] < L)v += 1ll * r * L - s[r];res = min(res, v);}return res;
}
LL check(LL value){LL v1 = calc(x, sx, value), v2 = calc(y, sy, value);return v1 + v2 <= k;//v1+v2<=k时返回1,否则返回0
}
int main(){cin >> n >> k;for (int i = 1; i <= n; i++){cin >> x[i] >> y[i];}sort(x + 1, x + 1 + n);sort(y + 1, y + 1 + n);for (int i = 1; i <= n; i++){sx[i] = sx[i - 1] + x[i];sy[i] = sy[i - 1] + y[i];}LL l = 0, r = 1e9;while (l < r) {int mid = l + r >> 1;if (check(mid))r = mid;elsel = mid + 1;}cout << r << endl;return 0;
}

学习交流

以下学习交流QQ群,群号: 546235402,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数学习 PTA 1使用函数输出一个整数的逆序数;3判断满足条件的三位数;5使用函数求余弦函数的近似值

其实一共有五道题&#xff0c;但那两道实在太过简单&#xff0c;也不好意思打出来给大家看&#xff0c;那么这篇博客&#xff0c;就让我一次性写三道题吧&#xff01;也当是个小总结&#xff0c;睡前深思。 6-1 使用函数输出一个整数的逆序数 本题要求实现一个求整数的逆序数的…

【面试】css预处理器之sass(scss)

目录 为什么引入css预处理器 可读性 嵌套&#xff1a;关系明朗 选择器 属性 伪类‘’ 变量&#xff1a;语义明确 默认变量&#xff1a;美元符号 $ 变量名:值 !default 全局变量&#xff1a;:global { $global-x: } 变量插值&#xff1a;#{} map键值对&#xff1a;$…

深度学习框架:Pytorch与Keras的区别与使用方法

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 Pytorch与Keras介绍 Pytorch 模型定义 模型编译 模型训练 输入格式 完整代码 Keras 模型定义 模型编译 模型训练 输入格式 完整代…

微服务链路追踪组件SkyWalking实战

概述 微服务调用存在的问题 串联调用链路&#xff0c;快速定位问题&#xff1b;理清服务之间的依赖关系&#xff1b;微服务接口性能分析&#xff1b;业务流程调用处理顺序&#xff1b; 全链路追踪&#xff1a;对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…

基于Java web的多功能游戏大厅系统的开发与实现

摘 要 目前&#xff0c;国内游戏市场上的网络游戏有许多种类&#xff0c;游戏在玩法上也越来越雷同&#xff0c;形式越来越单调。这种游戏性系统给玩家带来的成就感虽然是无穷的&#xff0c;但是也有随之而来的疲惫感&#xff0c;尤其是需要花费大量的时间和精力&#xff0c;这…

ESP32-Web-Server编程- WebSocket 编程

ESP32-Web-Server编程- WebSocket 编程 概述 在前述 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 中&#xff0c;我们创建了一个基于 HTTP 协议的 ESP32 Web 服务器&#xff0c;每当浏览器向 Web 服务器发送请求&#xff0c;我们将 HTML/CSS 文件提供给浏览器。 使用…

从0开始学习JavaScript--JavaScript 中 `let` 和 `const` 的区别及最佳实践

在JavaScript中&#xff0c;let 和 const 是两个用于声明变量的关键字。尽管它们看起来很相似&#xff0c;但它们之间有一些重要的区别。本篇博客将深入探讨 let 和 const 的用法、区别&#xff0c;并提供一些最佳实践&#xff0c;以确保在代码中正确使用它们。 let 和 const …

U-boot(七):U-boot移植

本文主要探讨基于210官方U-boot源码移植。 移植基础 tar -jxvf android_uboot_smdkv210.tar.bz2cd u-boot-samsung-devrm -rf onenand_ipl onenand_bl1 lib_avr32 lib_blackfin lib_i386 lib_m68k lib_mips lib_microblaze lib_nios lib_nios2 lib_ppc lib_sh lib_sparccd bo…

11.兔子生崽问题【2023.11.26】

1.问题描述 有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问 第二十个月的兔子对数为多少对&#xff1f; 2.解决思路 3.代码实现 #include<stdio.h> int mai…

Linux:windows 和 Linux 之间文本格式转换

背景 在 Windows 上编辑的文件&#xff0c;放到 Linux 平台&#xff0c;有时会出现奇怪的问题&#xff0c;其中有一个是 ^M 引起的&#xff0c;例如这种错误&#xff1a; /bin/bash^M: bad interpreter 这个问题相信大家也碰到过&#xff0c;原因是 Windows 和 Linux 关于换行的…

Javase | Java常用类 (不断补充中...)

目录: 1.Object类2.String类3.StringBuffer类4.Math类5.Random类6.包装类(不断补充中...) 1.Object类 Object类是Java语言中的所有类的超类&#xff0c;即所有类的根。它中描述的所有方法&#xff0c;所有类都可以使用。 equals( ) : 指示其他某个对象与此对象“是否相等” (比…

PC端数据列表有头像显示头像,没有头像显示名字的第一个字

PC端数据列表有头像显示头像&#xff0c;没有头像显示名字的第一个字 .charAt(0) 是 JavaScript 字符串对象的方法&#xff0c;用于获取字符串的第一个字符。 字符串中的字符位置是从 0 开始的&#xff0c;所以.charAt(0) 就表示获取字符串的第一个字符。 <el-table ref&qu…