AtCoder Beginner Contest 196 A~E 题解

news/2024/12/21 20:42:41/文章来源:https://www.cnblogs.com/stanleys/p/18403462/abc196

A - Difference Max

题目大意

给定四个整数\(a,b,c\)\(d\)
我们要选择两个整数\(x\)\(y\)\(a\le x\le b\)\(c\le y\le d\))。输出最大的\(x-y\)

\(-100\le a\le b\le 100\)
\(-100\le c\le d\le 100\)

输入格式

\(a~~b\)
\(c~~d\)

输出格式

输出最大的\(x-y\)

样例

\(a\) \(b\) \(c\) \(d\) 输出
\(0\) \(10\) \(0\) \(10\) \(10\)
\(-100\) \(-100\) \(100\) \(100\) \(200\)
\(-100\) \(100\) \(-100\) \(100\) \(200\)

分析

如果要\(x-y\)最大,那么\(x\)要尽可能大、\(y\)要尽可能小。因此,\(x\)取最大值\(b\)\(y\)取最小值\(c\)。所以,我们直接输出\(b-c\)即可。

代码

#include <cstdio>
using namespace std;int main()
{int a, b, c, d;scanf("%d%d%d%d", &a, &b, &c, &d);printf("%d\n", b - c);return 0;
}

B - Round Down

题目大意

给定一个数\(X\),求\(\lfloor X\rfloor\)

\(0\le X\le 10^{100}\)

输入格式

\(X\)

输出格式

输出\(\lfloor X\rfloor\)

样例

\(X\) 输出
\(5.90\) \(5\)
\(0\) \(0\)
\(84939825309432908832902189.9092309409809091329\) \(84939825309432908832902189\)

分析

只需找到小数点并将其及后面的数位删去再输出即可。例如:\(5\sout{.90}\)

代码

#include <cstdio>
using namespace std;int main()
{char c;while((c = getchar()) != '\n'){if(c == '.') return 0;putchar(c);}return 0;
}

C - Doubled

题目大意

\(1\)~\(N\)之间有多少个数是另一个正整数重复两遍得来的?

\(1\le N<10^{12}\)

输入格式

\(N\)

输出格式

输出答案。

样例

\(N\) 输出
\(33\) \(3\)
\(1333\) \(13\)
\(10000000\) \(999\)

分析

这道题说白了就是要找到最大的\(X\),使得\(X\)重复两遍不超过\(N\),并输出\(X\)。我们可以使用二分法求出最大的\(X\)
注意:这里的二分右边界最好设置为\(\sqrt N\),否则一不小心就会溢出!

代码

#include <cstdio>
#include <cmath>
using namespace std;typedef long long LL;inline bool check(const LL& x, const LL& n)
{LL p = 1LL;while(p <= x) p *= 10LL;return x * p + x <= n;
}int main()
{LL n;scanf("%lld", &n);LL l = 0LL, r = sqrt(n);while(l < r){LL mid = l + r + 1LL >> 1LL;if(check(mid, n)) l = mid;else r = mid - 1;}printf("%lld\n", l);return 0;
}

D - Hanjo

题目大意

有一个\(H\times W\)的地板,请你在地板上铺砖。
有两种地砖:\(a\)\(b\)\(a\)地砖有\(A\)个,是\(2\times1\)的可旋转长方形。\(b\)地砖有\(B\)个,是\(1\times1\)的正方形。问要将这个地板正好铺满,总共有多少种铺法?

\(1\le H,W,HW\le 16\)
\(0\le A,B\)
\(2A+B=HW\)

输入格式

\(H~W~A~B\)

输出格式

输出答案。

样例

\(H\) \(W\) \(A\) \(B\) 输出
\(2\) \(2\) \(1\) \(2\) \(4\)
\(3\) \(3\) \(4\) \(1\) \(18\)
\(4\) \(4\) \(8\) \(0\) \(36\)

分析

由于数据范围较小,我们可以用暴力搜索解决这道题。注意,这里搜索时为了避免重复计算,我们每次递归只尝试一个位置,这样还能有效加速。具体请看代码。

代码

#include <cstdio>
#define maxn 20
using namespace std;bool mat[maxn][maxn];
int h, w, a, b, ans;inline bool valid(int x, int y)
{return !mat[x][y] && x >= 0 && x < h && y >= 0 && y < w;
}void dfs(int i, int j, int usedA, int usedB)
{if((usedA << 1) + usedB == h * w){ans ++;return;}if(i == h) return;int ni, nj;if(j == w - 1) ni = i + 1, nj = 0;else ni = i, nj = j + 1;if(mat[i][j]){dfs(ni, nj, usedA, usedB);return;}mat[i][j] = true;// Rectangle (A)if(usedA < a){if(valid(i, j + 1)){mat[i][j + 1] = true;dfs(ni, nj, usedA + 1, usedB);mat[i][j + 1] = false;}if(valid(i + 1, j)){mat[i + 1][j] = true;dfs(ni, nj, usedA + 1, usedB);mat[i + 1][j] = false;}}// Square (B)if(usedB < b) dfs(ni, nj, usedA, usedB + 1);mat[i][j] = false;
}int main()
{scanf("%d%d%d%d", &h, &w, &a, &b);dfs(0, 0, 0, 0);printf("%d\n", ans);return 0;
}

E - Filters

题目大意

给定三个整数序列\(A = (a_1, a_2, \dots, a_N)\)\(T = (t_1, t_2, \dots, t_N)\)\(X = (x_1, x_2, \dots, x_Q)\)
我们如下定义\(N\)个函数\(f_1(x), f_2(x), \dots, f_N(x)\)
\(f_i(x) = \begin{cases} x + a_i & (t_i = 1)\\ \max(x, a_i) & (t_i = 2)\\ \min(x, a_i) & (t_i = 3)\\ \end{cases}\)
对于每个\(i = 1, 2, \dots, Q\),求\(f_N( \dots f_2(f_1(x_i)) \dots )\)

\(1 \le N,Q \le 2 \times 10^5\)
\(|a_i|,|x_i|\le 10^9\)
\(1 \le t_i \le 3\)

输入格式

\(N\)
\(a_1~t_1\)
\(a_2~t_2\)
\(\vdots\)
\(a_N~t_N\)
\(Q\)
\(x_1~x_2~\dotsx x_q\)

输出格式

输出\(Q\)行。第\(i\)行应该包含\(f_N( \dots f_2(f_1(x_i)) \dots )\)

样例

样例输入

3
-10 2
10 1
10 3
5
-15 -10 -5 0 5

样例输出

0
0
5
10
10

在这里,\(f_1(x) = \max(x, -10), f_2(x) = x + 10, f_3(x) = \min(x, 10)\),则有:

  • \(f_3(f_2(f_1(-15))) = 0\)
  • \(f_3(f_2(f_1(-10))) = 0\)
  • \(f_3(f_2(f_1(-5))) = 5\)
  • \(f_3(f_2(f_1(0))) = 10\)
  • \(f_3(f_2(f_1(5))) = 10\)

分析

(参考AtCoder官方题解)
很容易想到,我们可以直接照做,即分别计算每个\(f_N( \dots f_2(f_1(x_i)) \dots )\)。但是,这样做的时间复杂度是\(\mathcal O(NQ)\),所以肯定会TLE
我们考虑它们的复合函数\(F(x)=f_N( \dots f_2(f_1(x_i)) \dots )\)在图上怎么表示。

  • \(t_i=1\)\(f_i\)是将图整体平移的操作;
  • \(t_i=2\)\(f_i\)是将图的最小值设为\(a_i\)
  • \(t_i=3\)\(f_i\)是将图的最大值设为\(a_i\)

所以,我们可以得到下图:
F(x)和x的关系

或者说,存在三个数\(a,b,c\)使得\(F(x)=\min(c,\max(b,x+a))\)
关于\(a,b,c\)的具体计算请看代码。

代码

注意:这里的代码中的\(\infty\)INF)一定不能直接设为long long的最大值,否则会溢出!

#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;typedef long long LL;
const LL INF = LLONG_MAX >> 1LL;int main()
{LL l = -INF, r = INF, add = 0LL;int n, q;scanf("%d", &n);while(n--){LL a, t;scanf("%lld%lld", &a, &t);if(t == 1) l += a, r += a, add += a;else if(t == 2) l = max(l, a), r = max(r, a);else l = min(l, a), r = min(r, a);}scanf("%d", &q);while(q--){LL x;scanf("%lld", &x);printf("%lld\n", clamp(x + add, l, r));}return 0;
}

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

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

相关文章

AtCoder Beginner Contest 173 A~D 题解

A - Payment 题目大意 如果使用价值\(1000\)元的纸币(假设有)支付\(N\)元,服务员会找多少钱? \(1\le N\le 10000\) 输入格式 \(N\) 输出格式 一行,即服务员找的钱数。 样例输入 输出1900 1003000 0分析 特判: 如果\(N\)除以\(1000\)能整除,那么不需要找钱,输出\(0\); …

AtCoder Beginner Contest 188 A~D 题解

A - Three-Point Shot 题目大意 有两个球队,分别得到\(X\)分和\(Y\)分,问得分较少的球队能否在获得三分后超越对方。 \(0\le X,Y\le 100\) \(X \ne Y\) \(X\)和\(Y\)都是整数。 输入格式 \(X~Y\) 输出格式 如果能,输出Yes;否则,输出No。 样例X Y 输出3 5 Yes分析 这个不用…

Eclipse安装包下载慢解决方法

最近开始学习Java,使用经典的Eclipse IDE,结果发现下载太慢……问题分析Eclipse的下载依赖于其他镜像,(在我这里)默认为朝鲜的镜像(可能在不同电脑中默认不同):点击Select Another Mirror:选择中国的镜像:

程序无法启动,因为您的计算机缺少msvcr71.dll。

背景 打开CrystalTile2这个软件出现此提示。 解决 有很多解决办法,最简单粗暴也是见效最快的就是直接从网上下载dll文件放到对应位置。 下载 https://msvcr71.dll-box.com/zh/自己存了一份,以免网址失效(虽然按道理来说一般不会失效)。 https://www.123pan.com/s/EhW3jv-IW…

Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解

题目大意 输入三个整数\(a\),\(b\),\(c\),如果 \(\sqrt a + \sqrt b < \sqrt c\) 成立,输出Yes,否则输出No。 样例 输入 #1 2 3 9输出 #1 No\(\sqrt 2 + \sqrt 3 < \sqrt 9\) 不成立。 输入 #2 2 3 10输出 #2 Yes\(\sqrt 2 + \sqrt 3 < \sqrt 10\) 成立。 分析 错…

CodeForces Round #621 ABC (1307A+1307B+1307C) 题解

A. Cow and Haybales 题面 The USA Construction Operation (USACO) recently ordered Farmer John to arrange a row of n haybale piles on the farm. The \(i\)-th pile contains \(a_i\) haybales. However, Farmer John has just left for vacation, leaving Bessie all o…

Python函数之*[参数名]和**[参数名]的用处

一、*[参数名] 调用 合法调用 普通调用 *参数名一般写成*args, 如: def func(*args):print(args)可以试着调用func: >>> func(1) (1,) >>> func() () >>> func(1, 2, 3) (1, 2, 3) >>> func(dict(), set(), str(), int()) ({}, set(), ,…

discuz3.4文件包含漏洞

首先查看修复:可以看到新增代码preg_match("/^[\w-]+\.php$/i", $parse[path])) 来验证path是否为php文件,这个应该是修复路径遍历导致的文件读取漏洞。还有require ./.$_ENV[curapp]..php;这里应该是另外一个漏洞,因为$parse[path]和$_ENV[curapp]没有关联。 然后…

河道漂浮物识别检测系统

河道漂浮物识别检测系统依据智能视频分析,视频图像信息内容自动分析和识别,不用人工操纵;检测漂浮物(塑料泡沫、包装袋、堤岸漂浮植物种类等)生物群落等),精确提交检测结果,储存有关信息,便捷查验管理。河道漂浮物识别检测系统实时监控河面状况,对违法行为开展警报、…

厨师帽厨师服口罩穿戴人脸识别-智慧食安监督系统

厨师帽厨师服口罩穿戴人脸识别就是指在监管前提下提早设定查验区域,当规定区域有不戴厨师帽不穿戴厨师服或者口罩,系统自动会警报。厨师帽厨师服口罩穿戴人脸识别-智慧食安监督系统根据视频智能分析商品,在数据分析系统优化计算方法服务中,扩展了非厨房工作人员 进入后厨以…

web 开发(4)- 数据库sql

sql创建数据库sudo mysql 进入 mysql> create database book_01安装 mysqlclient sudo apt-get install libmysqlclient-dev sudo apt-get update 远程控制SQL得到远程密码 sudo cat /etc/mysql/debian.cnf 获取IP地址 ifconfig sudo mysql 问题一,不允许远程控制 先进入本…

隧道视频监控智能分析系统

隧道视频监控智能分析系统是道路交通方式不可缺少的监管手段,隧道视频监控智能分析系统有效进行交通违法和紧急事件的全自动识别和交通出行流量的全自动数据分析,并依据城市路口、城市道路、高速路、道路、公安机关监控、隧道、公路桥梁、地下停车场等各类实际路面生态环境开…