[补题记录] Atcoder Beginner Contest 324(E、F)

news2025/7/19 16:52:40

URL:https://atcoder.jp/contests/abc324

目录

E

Problem/题意

Thought/思路

Code/代码

F

Problem/题意

Thought/思路

Code/代码


E

Problem/题意

给出 N 个字符串和 1 个 T 字符串,都由小写字母组成。

现在从 N 个字符串中任取 2 个拼接,如果拼接后的字符串的子序列包含 T 字符串,则这是一种合法拼接。

问有多少种拼接方案。

Thought/思路

每种方案都只能由两个字符串组成,很容易想到:是否能求出有多少个字符串能作为前缀,有多少个字符串能作为后缀。

假设字符串 S[i] 在 T 中的前缀长度为 pre[i],在 T 中的后缀长度为 suf[i]。

那么对于一个二元组(i,j),只要 pre[i] + suf[j] >= len(T),就能作为一种方案。

但是一一匹配肯定是超时的,考虑到遍历过程中我们知道 pre[i] 和 suf[i],就能算出一个值:len(T) - pre[i]。这个值代表着,只要后缀长度大于等于它的,都能作为一次答案。

因此,我们只需要多维护一个 count[i],表示后缀长度为 i 的个数即可,最后的答案就是:

\sum_{i=1}^{N}\sum_{j=\left | T \right |-pre[i]}^{\left | T \right |}count[j]

至于这双重循环会不会超时,把 count[j] 当作 1,展开算一下就知道了。

Code/代码

#include "bits/stdc++.h"

#define int long long

int n, pre[500007], suf[500007],count[500007];
std::string T;

int subSequence(std::string s) {
	int res = 0, len = s.length();
	for (int i = 0, j = 0; i < len; ++ i) {
		if (s[i] == T[j]) j ++, res = j;
	}
	return res;
}

signed main() {
	std::cin >> n >> T;

	std::vector <std::string> S(n + 1);
	for (int i = 1; i <= n; ++ i) {
		std::cin >> S[i];
		pre[i] = subSequence(S[i]);
	}

	std::reverse(T.begin(), T.end());

	for (int i = 1; i <= n; ++ i) {
		std::reverse(S[i].begin(), S[i].end());
		suf[i] = subSequence(S[i]);
		count[suf[i]] ++;
	}

	int ans = 0;
	for (int i = 1; i <= n; ++ i) {
		int r = T.length();
		for (int j = r - pre[i]; j <= r; ++ j) {
			ans += count[j];
		}
	}

	std::cout << ans;
}

F

Problem/题意

给出一个有向图,每条边有两个值 b 和 c。问从 1 到 N 的路线中,那条路线的 ∑b / ∑c 最大,求出这个最大值。

Thought/思路

分数规划 \frac{\sum b_{i}}{\sum c_{i}} \geqslant x 或 \frac{\sum b_{i}}{\sum c_{i}} \leqslant x

在这简单回忆一下分数规划:

因为 \frac{\sum b_{i}}{\sum c_{i}} 在题目环境下通常都有 min、max 值,所以可以二分 X ∈ [min, max]。

一般来说,会以 b_{i}-x*c_{i} 作为不同题目环境下的权值。(选物品就类似价值,图论就类似边权)

而对于某个 X,我们需要回到题目中明确约束条件,寻找适合 X 的二分条件,选择合适的算法求出:

\sum b_{i}-x*c_{i}


在这道题中,我们需要求出 \frac{\sum b_{i}}{\sum c_{i}} 的最大值,所以要将 x 最大化,从而得出:

\sum b_{i}-x*c_{i} \geqslant 0

而要满足这个条件,最低要求只需要一条最长路 dis[n] >= 0 即可。(因为在题目中 \frac{\sum b_{i}}{\sum c_{i}} 相当于是边权求和,所以是最长路)

但是求最长路比较麻烦,我们加个负号将其改为最短路:

\sum x*c_{i} - b_{i} \leqslant 0

这时结果判断也要改成 dis[n] <= 0。

Code/代码

#include "bits/stdc++.h"

#define int long long

const int inf = 1e9;

struct node {
	int e, b, c;
	double d;
};

int n, m;
double dis[200007];
std::vector <node> g[200007];

bool check(double x) {
	// 构建边权
	for (int i = 1; i <= n; ++ i) {
		dis[i] = inf;
		for (int j = 0; j < g[i].size(); ++ j) {
			g[i][j].d = -(g[i][j].b - x * g[i][j].c);
		}
	}

	// 求最短路
	dis[1] = 0;
	for (int i = 1; i <= n; ++ i) {
		for (int j = 0; j < g[i].size(); ++ j) {
			node next = g[i][j];
			dis[next.e] = std::min(dis[next.e], next.d + dis[i]);
		}
	}

	return dis[n] <= 0; // 加了负号,这里也要改
}

signed main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0); std::cout.tie(0);

	std::cin >> n >> m;
	for (int i = 1; i <= m; ++ i) {
		int x, y, b, c;
		std::cin >> x >> y >> b >> c;
		g[x].push_back({y, b, c, 0.0});
	}

	double l = 0, r = 10000;
	while (r - l > 1e-10) {
		double mid = (r + l) / 2;
		if (check(mid)) l = mid;
		else r = mid;
	}

	std::cout << std::fixed << std::setprecision(10) << l;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子邮件地址注册过程详解

许多人可能对如何注册电子邮件地址感到困惑&#xff0c;本文将详细解析电子邮件地址的注册过程&#xff1a;确定邮箱厂商、创建邮箱账户、设置电子邮件地址。 1、确定要注册的邮箱厂商 首先我们需要确定要注册哪种类型的电子邮件服务。目前市场上有许多不同的电子邮件服务提供商…

实现日期间的运算——C++

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

Java内存模型-Java Memory Model(JMM)-可见性、原子性、有序性

5. Java内存模型之JMM 5.1 先从大场面试开始 你知道什么是Java内存模型JMM吗&#xff1f; JMM和volatile他们两个之间的关系&#xff1f; JMM没有那些特征或者它的三大特征是什么&#xff1f; 为什么要有JMM&#xff0c;它为什么出现&#xff1f;作用和功能是什么&#xf…

C++数据结构X篇_15_求二叉树叶子数与高度(递归方法)

本篇参考求二叉树叶子数与高度&#xff08;C&#xff09;进行整理。 文章目录 1. 二叉树中叶子数与高度2. 求二叉树叶子数与高度的实现代码 1. 二叉树中叶子数与高度 我们首先来看一看二叉树中叶子数与高度的定义&#xff1a; 叶子数&#xff1a;对于一个二叉树的节点&#x…

【微信小程序】6天精准入门(第3天:小程序flex布局、轮播图组件及mock运用以及综合案例)附源码

一、flex布局 布局的传统解决方案&#xff0c;基于[盒状模型]&#xff0c;依赖display属性 position属性 float属性 1、什么是flex布局&#xff1f; Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。任何一个容器都可以…

基于五折交叉验证的支持向量机SVR回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

一&#xff1a;排序的概念及引入 1.1 排序的概念 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…

[Python中常用的回归模型算法大全2:从线性回归到XGBoost]

文章目录 概要多输出K近邻回归集成算法回归梯度提升决策树回归随机森林回归 概要 回归分析在数据科学领域扮演着关键角色&#xff0c;用于预测数值型目标变量。本文深入探讨了几种常用的回归模型&#xff0c;包括多输出K近邻回归&#xff0c;决策树回归&#xff0c;集成算法回…

告别手动调节!iOS 17让你全自动调节音量大小,那么如何实现个性化音量呢

多亏了iOS 17&#xff0c;你的AirPods Pro 2现在具有个性化音量功能&#xff0c;可以根据周围环境智能调整音频音量。 这很酷&#xff0c;任何喜欢尽可能降低音量以避免听力受损的人都会对此表示赞赏。使用个性化音量&#xff0c;你的iPhone将检测音量何时可以降低&#xff0c…

MyBatisPlus-02

一 查询条件的三种 1.按条件查询 //方式一&#xff1a;按条件查询QueryWrapper qw new QueryWrapper();qw.lt("age",18);List<User> userList userDao.selectList(qw);System.out.println(userList); 2.lambda格式按条件查询 //方式二&#xff1a;lambda格…

【前端学习】—函数节流(九)

【前端学习】—函数节流&#xff08;九&#xff09; 一、什么是函数节流 函数节流&#xff1a;规定在一个单位时间内&#xff0c;事件响应函数只能被触发一次&#xff0c;如果这个单位时间内触发多次函数&#xff0c;只有一次生效。 二、函数节流使用场景 window.onresize事…

pytorch代码实现之动态蛇形卷积模块DySnakeConv

动态蛇形卷积模块DySnakeConv 血管、道路等拓扑管状结构的精确分割在各个领域都至关重要&#xff0c;确保下游任务的准确性和效率。 然而&#xff0c;许多因素使任务变得复杂&#xff0c;包括薄的局部结构和可变的全局形态。在这项工作中&#xff0c;我们注意到管状结构的特殊…

安达发|大多数离散型生产模式适用APS自动排程系统

在离散型生产模式中&#xff0c;智能生产排程软件&#xff08;APS&#xff09;的应用越来越广泛。这是因为APS能够根据实时的生产需求和资源状况&#xff0c;自动进行生产计划的制定和调整&#xff0c;从而提高生产效率&#xff0c;降低生产成本&#xff0c;保证生产的顺利进行…

美国股票和加密货币平台【Alpaca】完成1500万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国加利福尼亚州圣马特奥的股票和加密交易经纪平台提供商&#xff0c;近期宣布已从SBI集团获得了1500万美元融资。 该公司打算利用这笔资金加快业务扩张&#xff0c;并将其业务范围扩大到…

iPaaS混合集成平台,打造数字化生态

如今企业分工越来越细&#xff0c;上下游合作越来越紧密、各企业之间的业务系统需要相互协作完成业务、外部API依赖越来越多、同时企业系统运行在多个混合云环境及SaaS中&#xff0c;私有端大量业务系统与云端系统形成了错综复杂的集成关系&#xff0c;企业面临集成技术复杂多样…

Springboot整合taos时序数据库TDengine

1.首先安装TDengine服务端在linux上 TDengine多种安装包的安装和卸载 - TDengine | 涛思数据安装过程直接去官网看,非常详细简单 2.出现的问题 windows连接 invalid app version 版本不对应 版本不对应的问题,需要在linux上安装的版本和windows client版本一致,不然w…

Kubernetes基础(六)-常见 Kubernetes Pod 驱逐场景

Kubernetes Pod 被驱逐是什么意思&#xff1f; 它们被终止&#xff0c;通常是没有足够资源的结果。但是为什么会这样呢&#xff1f; 驱逐是指派给节点的Pod 被终止的过程。 Kubernetes 中最常见的情况之一是Preemption&#xff0c;为了在资源有限的节点中调度新的 Pod&#…

安卓14通过“冻结”缓存应用程序腾出CPU,提高性能和内存效率

本月早些时候&#xff0c;我们听说更新到安卓14似乎提高了谷歌Pixel 7和Pixel 6的效率——提高了电池寿命&#xff0c;并在这个过程中减少了热量的产生。现在看来&#xff0c;安卓14的增效功能细节已经公布。 安卓侦探Mishaal Rahman在X&#xff08;前身为Twitter&#xff09;…

林沛满--快递员的工作策略——TCP窗口

本文整理自&#xff1a;《Wireshark网络分析就这么简单 第1版》 作者&#xff1a;林沛满 著 出版时间&#xff1a;2014-12 假如你是一位勤劳的快递员&#xff0c;要送100个包裹到某公司去&#xff0c;怎样送货才科学? 最简单的方式是每次送1个&#xff0c;总共跑100趟。当然这…