AtCoder Beginner Contest 274 A~E 题解

吐槽:这比赛名字为啥没有英文版。。。

A - Batting Average

题目大意

给定整数\(A,B\),输出\(\frac BA\),保留三位小数。

\(1\le A\le 10\)
\(0\le B\le A\)

分析

签到题,使用printfcout格式化输出即可。

代码

#include <cstdio>
using namespace std;int main()
{int a, b;scanf("%d%d", &a, &b);printf("%.3Lf\n", (long double)b / a);return 0;
}

B - Line Sensor

题目大意

给定一个\(H\times W\)的网格,每个方格内都是.#
求每一列的#的个数,分别输出。

\(1\le H,W\le 1000\)

分析

开一个数组ans[W],存储每一列的#的个数。输入时统计一下即可。

代码

#include <cstdio>
#define maxn 1005
using namespace std;char s[maxn];
int ans[maxn];int main()
{int n, m;scanf("%d%d", &n, &m);while(n--){scanf("%s", s);for(int i=0; i<m; i++)if(s[i] == '#')ans[i] ++;}for(int i=0; i<m; i++)printf("%d ", ans[i]);return 0;
}

C - Ameba

题目大意

有一棵由\(2N+1\)个结点组成的树,根结点是\(1\)

整棵树用一个序列\(A=(A_1,A_2,\dots,A_N)\)表示:

  • 结点\(A_i\)\(2i\)\(2i+1\)的父亲。

求每个结点的深度。

\(1\le N\le 2\times 10^5\)
\(1\le A_i\le 2i-1\)

解法1

根据题意构造树的邻接表,从根结点\(1\)开始向下搜索,从而推出每个结点的深度。

#include <cstdio>
#include <vector>
#define maxn 200005
using namespace std;vector<int> G[maxn << 1];
int dep[maxn << 1];void dfs(int v, int par)
{for(int u: G[v])if(u != par){dep[u] = dep[v] + 1;dfs(u, v);}
}int main()
{int n;scanf("%d", &n);for(int i=1; i<=n; i++){int x;scanf("%d", &x);G[x].push_back(i << 1);G[x].push_back(i << 1 | 1);}dep[1] = 0;dfs(1, -1);for(int i=1; i<=(n<<1)+1; i++)printf("%d\n", dep[i]);return 0;
}

解法2(最优解)

我们从解法\(1\)进一步考虑:由于\(1\le A_i\le 2i-1\),所以\(A_i\)一定在\(2i\)\(2i+1\)前被处理,那么直接在输入时计算depth[2*i] = depth[2*i+1] = depth[A[i]] + 1即可。

#include <cstdio>
#include <vector>
#define maxn 200005
using namespace std;int dep[maxn << 1];int main()
{int n;scanf("%d", &n);for(int i=1; i<=n; i++){int x;scanf("%d", &x);dep[i << 1] = dep[i << 1 | 1] = dep[x] + 1;}for(int i=1; i<=(n<<1)+1; i++)printf("%d\n", dep[i]);return 0;
}

D - Robot Arms 2

题目大意

给定整数\(N\)和序列\(A=(A_1,A_2,\dots,A_N)\),能否在平面直角坐标系中通过\(N\)步从\((0,0)\)走到\((x,y)\)?每一步如下:

  • \(1\)步:从\((0,0)\)走到\((A_1,0)\)(向右前进\(A_1\)格)。
  • \(i\)步(\(i>1\))先左转或右转\(90\degree\),再前进\(A_i\)格。

\(2\le N\le 10^3\)
\(1\le A_i\le 10\)
\(-10^4\le x,y\le 10^4\)

分析

先考虑另一个问题:

在一维坐标系中,从\(s\)开始进行\(N\)次位移,第\(i\)次的操作如下:
\(\to~\)选择左移或者右移\(A_i\)个长度单位,即坐标加上\(A_i\)或者减去\(A_i\)
\(N\)次操作后是否能到达终点\(t\)注意:必须为最终到达,中途经过不算数!

很容易想到使用一个简单的\(\text{DP}\),令\(f(i,j)\)表示前\(i\)次操作后是否能达到\(j\)\(0\)\(1\)),转移显而易见:\(f(i,j)=f(i-1,j-A_i)\vee f(i-1,j+A_i)\)
但是这样的时间复杂度很高,高达\(\mathcal O(Nk)\),其中\(k\)为坐标系大小。

稍加思考会发现,只有小部分坐标能真正达到,其余都没有必要参与转移,所以使用set进行存储,\(S_i\)表示前\(i\)次操作后能到达的坐标集合,利用\(S_i=(S_{i-1}+A_i)\cup(S_{i-1}-A_i)\)进行转移即可。

代码:

inline bool check(vector<int>& v, int start, int target)
{set<int> s;s.insert(start);for(int d: v){set<int> ls = s;s.clear();for(int x: ls)s.insert(x + d), s.insert(x - d);}return s.count(target);
}

然后回到原来的问题,发现由于\(x\)\(y\)两个坐标互不影响,所以把两个坐标轴分别独立出来是没有问题的,可以转换为刚才的子问题:

  • 对于\(x\)坐标,起始位置为\(A_1\),终点为\(x\),移动序列为\(A_3,A_5,\dots\)
  • 对于\(y\)坐标,起始位置为\(0\),终点为\(y\),移动序列为\(A_2,A_4,\dots\)

只要两个子问题的条件都满足,那么一定存在一种可行的操作序列来满足原题的要求。
至此,问题得到解决。

代码

#include <cstdio>
#include <vector>
#include <set>
using namespace std;inline bool check(vector<int>& v, int start, int target)
{set<int> s;s.insert(start);for(int d: v){set<int> ls = s;s.clear();for(int x: ls)s.insert(x + d), s.insert(x - d);}return s.count(target);
}int main()
{int n, x, y;scanf("%d%d%d", &n, &x, &y);vector<int> a(n);for(int& t: a) scanf("%d", &t);vector<int> dx;for(int i=2; i<n; i+=2)dx.push_back(a[i]);if(!check(dx, a[0], x)) { puts("No"); return 0; }vector<int> dy;for(int i=1; i<n; i+=2)dy.push_back(a[i]);puts(check(dy, 0, y)? "Yes": "No");return 0;
}

E - Booster

题目大意

在平面直角坐标系中,有\(N\)个城市和\(M\)个箱子。城市\(i\)位于坐标\((X_i,Y_i)\),箱子\(i\)则在坐标\((P_i,Q_i)\)

Takahashi现在要从原点\((0,0)\)开始访问\(N\)个城市,中途箱子可去可不去。他初始的速度为\(1\),每碰到一个箱子都可以将速度提升至原先的两倍(每个箱子只能加速一次)。

至少要用多少时间,才能将\(N\)个城市都访问至少一次?

分析

参考AtCoder 官方题解的做法,这里不详细解释。

代码

#include <cstdio>
#include <cmath>
#define maxn 17
using namespace std;inline double ppow(int x) { return 1.0 / (1 << __builtin_popcount(x)); }
inline void setmin(double& x, double y)
{if(y < x) x = y;
}double x[maxn], y[maxn], dp[maxn][1 << maxn];int main()
{// Inputint n, m;scanf("%d%d", &n, &m);m += n;for(int i=0; i<m; i++)scanf("%lf%lf", x + i, y + i);int mx = 1 << m;for(int i=0; i<m; i++)for(int s=0; s<mx; s++)dp[i][s] = 1e18;// DP: Initial statefor(int i=0; i<m; i++)dp[i][1 << i] = hypot(x[i], y[i]);// DP: Transferfor(int s=1; s<mx; s++){double coef = ppow(s >> n);for(int i=0; i<m; i++){if(!(s >> i & 1)) continue;for(int j=0; j<m; j++){if(s >> j & 1) continue;setmin(dp[j][s | (1 << j)],dp[i][s] + hypot(x[i] - x[j], y[i] - y[j])*coef);}}}// Outputdouble ans = 1e18;for(int i=0, t=1<<n; i<m; i++)for(int s=t-1; s<mx; s+=t)setmin(ans, dp[i][s] + dp[i][1 << i] * ppow(s >> n));printf("%.10f\n", ans);return 0;
}

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

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

相关文章

【算法笔记】位运算详解

0. 前言 突然想到位运算是个好东西,就来水一波文章了…… 注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! 本文中参考代码均使用C++编写。 废话不多说,下面步入正题。1. 基本运算 …

【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树

0. 前言 好久没更算法笔记专栏了,正好学了新算法来更新…… 这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢! 1. 关于 RMQ 问题 RMQ 的全称是 Range Minimum/Maximum Query,即区间最大/最小值问题。 本文中,我们的算法以求最大…

【算法笔记】树形DP算法总结详解

0. 定义 树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 1. 基础 令\(f[u]=~\)与树上顶点\(u\)有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行\(\text{DP}\),确保在更新一个顶点时其子节点的dp值已经被更新好,以更新当前…

Seay安装和初步使用

作者网站现在已经无法访问:http://www.cnseay.com/2951/, 可以使用这个GitHub - f1tz/cnseay: Seay源代码审计系统 下载完安装包之后,解压到自己想要的电脑路径即可,无需进行任何额外的配置 利用工具对sql注入进行分析 进入软件之后,点击新建项目,选择需要分析的文件(这里…

纸浆

日线: 小时线: 15分钟趋势: 关注5750一线支撑

代码整洁之道--读书笔记(5)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

02网络参考模型

02网络参考模型02网络参考模型常见网络模型因为 OSI协议栈比较复杂 ,且TCP和IP两大协议在业界被广泛使用,所以 TCP/IP参考模型 成为了互联网的主流参考模型。OIS网络模型层级作用7.应用层 应用层 对应用程序提供接口。6.表示层进行数据格式的转换,以确保一个系统生成的应用层…

《痞子衡嵌入式半月刊》 第 107 期

痞子衡嵌入式半月刊: 第 107 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

鼠标悬停显示的轮播图

今日整理,发现这种轮播图是最难实现的一种, 1.再循环中难以控制单一品类商品显示 解决办法: 在外面的主类里面添加&:hover触发标签属性的更改,这样可以单一作用 2.在循环中触发事件,所有的同一事件都会触发 解决办法:先建立模版控制排版,再从单一内容开始微调 <script s…

如何把网页的公式优雅地拷贝到word中:数学公式识别神器—Mathpix Snip

这个编辑器其实在把chatgpt的公式粘贴到word中时就已经使用了,用的是网页版。 现在下载了软件(但是好像一个月试用期过后得收费?但是就目前来说,体验感真的超级好) 把公式复制粘贴转成mathtype公式 可以截取电脑屏幕上的图像,如果图像上面有公式的话,就会识别,之后可以…

Redis 入门 - 图形化管理工具如何选择,最全分类

Redis图形化管理工具可分为四类:命令行工具、桌面客户端工具、网页工具、插件工具。看看哪一款适合你呢?工欲善其事必先利其器,上一章Redis服务环境已经搭建完成,现在就需要一个趁手的工具,有个好工具可以做到事半功倍。 Redis图形化管理工具五花八门,可供选择的很多,大…

Javaweb-事务

注意在当前窗口是修改了的:而在其他窗口是不修改的:select @@autocommit;修改为手动提交: