Atcoder Beginner Contest 271
前言
一场掉分的 ABC /kk
在花了 \(10\) 分钟看完前 \(4\) 题后,选择了赛场上大部分人使用的:先开 D,再按顺序做 A、B、C。(打题的时候才发现应该先开 C 的 QwQ)
但却因为 CSP-S 神秘的太空射线使得自身膨胀,结果 E 想复杂 \(\times \ 2\),当场去世。
都是因为 CSP-S,不是我的错
ABC 271 A 题
题目大意:
你需要把 \(x\) 转换成一个两位的 \(16\) 进制数,若不足两位则加上前导 \(0\)。
解法分析:
此题考查人们对输出语句的熟悉程度。
题目解法不多说,直接上代码。
AC Code:
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define GO(i,a,b) for(ll i = a; i <= b; i ++)
# define RO(i,b,a) for(ll i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define MP(a,b) make_pair(a, b)
# define PB(x) push_back(x)
# define mem(a,x) memset(a, x, sizeof a)
# define F first
# define S second
int n;
int main(){
scanf("%d", &n);
printf("%02llX", n);
return 0;
}
ABC 271 B 题
题目大意:
给你 \(n\) 个数组,第 \(i\) 个数组大小为 \(k_i\),再有 \(q\) 次询问,每次问你第 \(x\) 个数组的第 \(y\) 项是什么。
解法分析:
说句闲话,vector 是个好东西。
这道题显然需要动态大小的数组,那就非 vector 莫属了。
AC Code:
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define GO(i,a,b) for(ll i = a; i <= b; i ++)
# define RO(i,b,a) for(ll i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define MP(a,b) make_pair(a, b)
# define PB(x) push_back(x)
# define mem(a,x) memset(a, x, sizeof a)
# define F first
# define S second
CI maxn = 2e5 + 7;
int n, q;
int l;
vector <int> a[maxn];
int x, y;
int main(){
cin >> n >> q;
GO (i, 1, n){
scanf("%d", &l);
GO (j, 1, l){
int p;
scanf("%d", &p);
a[i].push_back(p);
}
}
while (q --){
scanf("%d %d", &x, &y);
printf("%d\n", a[x][y - 1]);
}
return 0;
}
ABC 271 C 题
题目大意:
高桥有 \(n\) 本书,第 \(i\) 本编号为 \(a_i\)。他可以不停的卖 \(2\) 本书获得一本任意编号的书,但当剩下的书不到 \(2\) 本时就不能这样了。现在高桥想要从编号为 \(1\) 的书开始读,看完一本就看下一个编号的书,如果没有就不能看了。高桥想尽量多的看书,请计算高桥最多可以看多少本书。
解法分析:
有两种做法,这里只讲二分。
这道题说到了最多,就想到了二分。考虑当现在二分到了 \(mid\),那么:
- 重复编号的书可以直接卖掉
- 剩下不重复编号但是编号大于 \(mid\) 的书也可以卖掉
当你将所有可以买的书卖掉后,看能不能达到期望的数量即可。
AC Code:
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define GO(i,a,b) for(ll i = a; i <= b; i ++)
# define RO(i,b,a) for(ll i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define MP(a,b) make_pair(a, b)
# define PB(x) push_back(x)
# define mem(a,x) memset(a, x, sizeof a)
# define F first
# define S second
CI maxn = 3e5 + 7;
int n, m;
int a[maxn];
bool check(int mid){
int res = 0;
GO (i, 1, m)
res += (a[i] <= mid);
return (mid - res) * 2 <= (n - res);
}
int main(){
cin >> n;
GO (i, 1, n)
scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
m = 1;
GO (i, 2, n)
if (a[i] != a[i - 1])
a[++ m] = a[i];
int l = 0, r = 1e9;
int ans = 0;
while (l <= r){
int mid = (l + r) >> 1;
if (check(mid)){
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
cout << ans;
return 0;
}
ABC 271 D 题
题目大意:
一共有 \(n\) 张牌,每一面都写着一个整数。卡 \(i\) (\(1≤i≤n\))前面写着整数 \(a_i\),后面写着整数 \(b_i\)。
你可以选择是否放置每张卡片的正面或背面可见。
确定是否可以调整卡片的正反面,使得可见整数的和恰好等于 \(s\) ,如果可能的话,找到卡片的位置来实现这一点。
解法分析:
这是一道一眼盯真的题。这道题目长得就像个 DP,那就设 \(f_{i,j}\) 为 前i个数和是否能凑成j,转移方程就是\(f_{i,j}=f_{i-1,j-a_i} | f_{i - 1, j - b_i}\) 。
又说这道题需要输出路径,这就是一个经典的路径还原了。设 \(w_{i,j}\) 为计算 \(f_{i,j}\) 时做出的选择,然后从后往前递归输出即可。
AC Code:
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define GO(i,a,b) for(ll i = a; i <= b; i ++)
# define RO(i,b,a) for(ll i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define MP(a,b) make_pair(a, b)
# define PB(x) push_back(x)
# define mem(a,x) memset(a, x, sizeof a)
# define F first
# define S second
CI maxn = 107;
int n, s;
int a[maxn], b[maxn];
bool f[maxn][10007];
char w[maxn][10007];
void out(int n, int s){
if (n == 0)
return ;
out(n - 1, s - (w[n][s] == 'H' ? a[n] : b[n]));
printf("%c", w[n][s]);
}
int main(){
cin >> n >> s;
GO (i, 1, n)
scanf("%d %d", &a[i], &b[i]);
f[0][0] = true;
GO (i, 1, n){
GO (j, 0, s){
f[i][j] = max <bool> ((j >= a[i] ? f[i - 1][j - a[i]] : 0), (j >= b[i] ? f[i - 1][j - b[i]] : 0));
if (j >= a[i] && f[i][j] == f[i - 1][j - a[i]])
w[i][j] = 'H';
else if (j >= b[i] && f[i][j] == f[i - 1][j - b[i]])
w[i][j] = 'T';
else
w[i][j] = 'I';
}
}
printf(f[n][s] ? "Yes\n" : "No\n");
if (f[n][s]) out(n, s);
return 0;
}
ABC 271 E 题
题目大意:
有一个有向图, 有\(N\) 个编号为 \(1,\dots,N\) 的点和 \(M\) 条编号为 \(1,\dots,M\) 的路。
第 \(i\) 条路从 \(A_i\) 到 \(B_i\),长度是 \(C_i\)。
给定长度为 \(K\) 的序列 \(E\) ,由 \(1\) 和 \(m\) 之间的整数组成。从城镇 \(1\) 到城镇 \(N\) 的道路被称为好路径,如果:
按照路径中使用的顺序排列的道路编号序列是 \(E\) 的子序列。
找出一条好的路径所使用的道路长度的最小和。
解法分析:
赛场上想复杂了很多次,一直以为要用 Dijsktra 来做,但其实不然。题目中说一定要按照顺序来走(构成子序列),从另一方面来看,这是在帮我们建图。因为我们只能用 \(E\) 中的边,还要按顺序使用,则不会出现编号靠后的边比编号靠前的边先走的情况,这就满足了 DP 的无后效性。而 DP 的另外两个性质也是显而易见的满足,于是这道题思路就出来了:设 \(f_i\) 为走到 \(i\) 的最短路,则按顺序遍历 \(E\) 的每一条边,每次更新就是 \(f_v = \min(f_v, f_u + w)\),最后输出 \(f_n\) 即可。
AC Code:
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define GO(i,a,b) for(ll i = a; i <= b; i ++)
# define RO(i,b,a) for(ll i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define MP(a,b) make_pair(a, b)
# define PB(x) push_back(x)
# define mem(a,x) memset(a, x, sizeof a)
# define F first
# define S second
CI maxn = 2e5 + 7;
int n, m, k;
int u[maxn], v[maxn], w[maxn];
int a, b;
ll dis[maxn];
int main(){
cin >> n >> m >> k;
GO (i, 1, n)
dis[i] = 2e18;
GO (i, 1, m)
scanf("%d %d %d", &u[i], &v[i], &w[i]);
dis[1] = 0;
GO (i, 1, k){
scanf("%d", &a);
dis[v[a]] = min <ll> (dis[v[a]], dis[u[a]] + w[a]);
}
cout << (dis[n] == 2e18 ? -1 : dis[n]);
return 0;
}
Atcoder Beginner Contest 271的更多相关文章
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
随机推荐
- 用 Tarjan 算法求解有向图的强连通分量
图论中的连通性概念是许多算法与应用的基础.当我们研究网络结构.依赖关系或路径问题时,理解图中的连通性质至关重要.对于不同类型的图,连通性有着不同的表现形式和算法解决方案. 无向图与有向图的连通性 在无 ...
- GC面试重点:垃圾回收机制
你知道哪些垃圾回收算法?垃圾回收从理论上非常容易理解,具体的方法有以下几种: 1. 标记-清除:2. 标记-复制:3. 标记-整理:4. 分代回收. 如何判断一个对象是否应该被回收?这就是所谓的对象存 ...
- 五分钟扫盲:25个工作中常用的Linux命令
目录 §基础篇 cd 命令 ls / ll 和 clear 命令 grep 命令 : 查找关键字 find命令 kill tail cp命令 mv命令 rm命令 mkdir命令 rmdir 命令 ca ...
- python之package定义
一.简单说明 python是通过module组织代码的,每一个module就是一个python文件,但是modules是通过package来组织的.我们平时在简单测试的时候 一般就是几个Python文 ...
- 关于PHP 函数性能优化的技巧
本文由 ChatMoney团队出品 本文将详细介绍 PHP 函数性能优化的技巧.通过分析 PHP 函数的执行过程和性能瓶颈,提供一系列实用的优化方法,并结合代码示例,帮助读者提升 PHP 代码的执行效 ...
- AI Infra 运维实践:DeepSeek 部署运维中的软硬结合
发布会资料 <AI Infra运维实践:DeepSeek部署运维中的软硬结合> 袋鼠云运维服务 1.行业痛点 随着数字化转型的深入,企业面临的运维挑战日益复杂,所依托的平台在长期使用的过 ...
- 使用redis的stream数据类型做消息队列
在redis5.0之前,如果想使用它作为简单的消息队列,最好的选择就是自身提供的pub/sub模式.它支持简单的发布/订阅模式,发布一个channel绑定一条消息,然后可以有多个消费者监听这个chan ...
- HDFS目录配额(quota)不足导致写文件失败
本文分享自天翼云开发者社区<HDFS目录配额(quota)不足导致写文件失败>,作者:5****m 问题背景与现象 给某目录设置quota后,往目录中写文件失败,出现如下问题"T ...
- AI对话机器人续:将AI Bot接入企业微信
大家好,我是Edison. 之前尝试将Coze AI Bot接入到了微信,有朋友问如何接入企业微信,今天有空尝试了下,和你分享一下过程. 整体流程和步骤还是基于chatgpt-on-wechat这个开 ...
- Kong入门学习实践(6)HTTPS与TCP流代理
最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看.由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版. 本篇,我们学习快速配置 ...