首页 > 其他分享 >VP Daiwa Securities Co. Ltd. Programming Contest 2024(AtCoder Beginner Contest 383)

VP Daiwa Securities Co. Ltd. Programming Contest 2024(AtCoder Beginner Contest 383)

时间:2025-01-15 20:10:10浏览次数:1  
标签:std Co Contest int cin Securities ++ vector dist

A - Humidifier 1

题意:一个漏水的桶,在零时刻有零升水,进行\(n\)次加水,在\(t_i\)时刻加\(v_i\)升水,每一时刻会漏一生水,问第n次加水后有多少升水。

直接模拟即可,每次加水先减去漏掉的水,注意至少有0升,然后加上新加的水。

点击查看代码
void solve() {
    int n;
    std::cin >> n;
    int last = 0, sum = 0;
    for (int i = 0; i < n; ++ i) {
    	int a, b;
    	std::cin >> a >> b;
    	sum = std::max(0, sum - (a - last));
    	sum += b;
    	last = a;
    }
    std::cout << sum << "\n";
}

B - Humidifier 2

题意:一个矩阵有墙有地板,你可以在两个地板上各放一个加湿器,加湿器会加湿距离他曼哈顿距离小于等于d的地板,你最多可以加湿多少地板。

直接枚举放在哪两个地板就行。

点击查看代码
void solve() {
 	int n, m, d;
 	std::cin >> n >> m >> d;
 	std::vector<std::string> s(n);
 	for (int i = 0; i < n; ++ i) {
 		std::cin >> s[i];
 	}   

 	auto get = [&](int x, int y, int i, int j) -> bool {
 		return std::abs(x - i) + std::abs(y - j) <= d;
 	};

 	int ans = 0;
 	for (int i = 0; i < n; ++ i) {
 		for (int j = 0; j < m; ++ j) {
 			if (s[i][j] == '#') {
 				continue;
 			}

 			for (int x = 0; x < n; ++ x) {
 				for (int y = 0; y < m; ++ y) {
 					if (s[x][y] == '#') {
 						continue;
 					}

 					int cnt = 0;
 					for (int l = 0; l < n; ++ l) {
 						for (int r = 0; r < m; ++ r) {
 							if (s[l][r] == '.' && (get(i, j, l, r) || get(x, y, l, r))) {
 								++ cnt;
 							}
 						}
 					}

 					ans = std::max(ans, cnt);
 				}
 			}
 		}
 	}

 	std::cout << ans << "\n";
}

C - Humidifier 3

题意:一个矩阵有墙有地板有加湿器,加湿器会加湿最短距离距离他小于等于d的地板,但这个路径中不能穿墙,问可以加湿多少地板。

bfs。
先把所有加湿器入队,用个dist存每个格子最多可以走的步数,统计所有可以走到的地板。

点击查看代码
void solve() {
    int n, m, d;
    std::cin >> n >> m >> d;
    std::vector<std::string> s(n);
    for (int i = 0; i < n; ++ i) {
    	std::cin >> s[i];
    }

    std::vector dist(n, std::vector<int>(m));
    std::queue<std::pair<int, int> > q;
    for (int i = 0; i < n; ++ i) {
    	for (int j = 0; j < m; ++ j) {
    		if (s[i][j] == 'H') {
    			dist[i][j] = d + 1;
    			q.push({i, j});
    		}
    	}
    }

    const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    while (q.size()) {
    	auto [x, y] = q.front(); q.pop();
    	for (int i = 0; i < 4; ++ i) {
    		int nx = x + dx[i], ny = y + dy[i];
    		if (nx < 0 || nx >= n || ny < 0 || ny >= m || s[nx][ny] == '#' || dist[nx][ny] > dist[x][y] - 1) {
    			continue;
    		}

    		dist[nx][ny] = dist[x][y] - 1;
    		q.push({nx, ny});
    	}
    }

    int ans = 0;
    for (int i = 0; i < n; ++ i) {
    	for (int j = 0; j < m; ++ j) {
    		if (s[i][j] != '#' && dist[i][j] > 0) {
    			++ ans;
    		}
    	}
    }

    std::cout << ans << "\n";
}

D - 9 Divisors

题意:问有多少恰好有九个因子的小于等于n的数。

刚开始以为是爆搜。。。
我们知道一个数有多少因子跟它的质因子有关,于是我们手玩一会后发现只有两种形式的数满足,一个数等于 \(p_1^2\)乘\(p_2^2\)的数,一个是等于\(p_i^8\)的数。

于是我们筛出所有质数后,二分每个质数能匹配到的最大质数,再看有哪些一个就可以的。

点击查看代码
void solve() {
    i64 n;
    std::cin >> n;
    const int N = 2e6 + 5;
    std::vector<i64> primes;
    std::vector<int> st(N);
    for (int i = 2; i < N; ++ i) {
    	if (!st[i]) {
    		primes.push_back(i);
    	}

    	for (auto & p : primes) {
    		if (p > N / i) {
    			break;
    		}

    		st[p * i] = 1;
    		if (i % p == 0) {
    			break;
    		}
    	}
    }

    i64 ans = 0;
    for (int i = 0; i + 1 < primes.size(); ++ i) {
    	int l = i + 1, r = (int)primes.size() - 1;
    	while (l < r) {
    		int mid = l + r + 1 >> 1;
    		i64 x = primes[i], y = primes[mid];
    		if ((__int128)x * x * y * y <= n) {
    			l = mid;
    		} else {
    			r = mid - 1;
    		}
    	}

    	i64 x = primes[i], y = primes[l];
		if ((__int128)x * x * y * y <= n) {
			ans += l - i;
		} else {
			break;
		}

		if ((__int128)x * x * x * x * x * x * x * x <= n) {
			++ ans;
		}
    }

    std::cout << ans << "\n";
}

题意:给你一个图和两个序列A和B,A中的数和B都不相同。 设\(f(u, v)\)是u到v中所有路径的最大边权中最小的。你可以打乱B的顺序,求最小的\(\sum_{i=1}^{k} f(A_i, B_i)\)。

先阅读最小生成树和瓶颈生成树以及最小瓶颈路的概念:https://oi-wiki.org/graph/mst/#瓶颈生成树
那么我们知道\(f(u, v)\)对应的边肯定在最小生成树里,我们可以按照\(Kruskal\)算法的顺序从小到大加边,那么我们发现,当加入一条边\((u, v)\)时,在此之前还没找到瓶颈路径的两个点,如果正好在合并的这两个联通块里,那么这条边就是他们最小瓶颈边,于是贪心的尽可能匹配就行,存一下每个集合在\(A\)里有多少点和在\(B\)里有多少点。

点击查看代码
void solve() {
    int n, m, k;
    std::cin >> n >> m >> k;
    std::vector<std::array<int, 3> > edges(m);
    for (int i = 0; i < m; ++ i) {
    	int u, v, w;
    	std::cin >> u >> v >> w;
    	-- u, -- v;
    	edges[i] = {w, u, v};
    }

    std::sort(edges.begin(), edges.end());
    std::vector<int> fa(n), cnta(n), cntb(n);
    std::iota(fa.begin(), fa.end(), 0);
    for (int i = 0; i < k; ++ i) {
    	int x;
    	std::cin >> x;
    	-- x;
    	++ cnta[x];
    }

    for (int i = 0; i < k; ++ i) {
    	int x;
    	std::cin >> x;
    	-- x;
    	++ cntb[x];
    }

    std::function<int(int)> find = [&](int x) -> int {
    	return x == fa[x] ? x : fa[x] = find(fa[x]);
    };

    i64 ans = 0;
    for (auto & [w, u, v] : edges) {
    	u = find(u), v = find(v);
    	if (u == v) {
    		continue;
    	}


    	fa[v] = u;
    	cnta[u] += cnta[v];
    	cntb[u] += cntb[v];
    	int min = std::min(cnta[u], cntb[u]);
    	ans += (i64)min * w;
    	cnta[u] -= min;
    	cntb[u] -= min;
    }

    std::cout << ans << "\n";
}

标签:std,Co,Contest,int,cin,Securities,++,vector,dist
From: https://www.cnblogs.com/maburb/p/18673668

相关文章

  • Coze 智能体:功能、架构设计与应用解析
    目录一、概述二、主要功能1.智能体创建与管理2.工作流设计3.插件扩展4.多渠道发布与接入5.数据交互与记忆三、架构设计1.核心模块2.系统架构图四、技术实现1.模块化插件设计2.可视化工作流引擎3.支持多模型适配五、应用领域1.内容生成与创作2.客......
  • 中考英语优秀范文-热点话题-传统文化-006 Welcome to Chinese Summer Camp 欢迎参加中
    1写作要求假定你是李华,你校今年暑假将为外国学生举办一场汉语夏令营活动(ChineseSummerCamp)。请你根据下面海报的内容,用英语给你的笔友David写一封电子邮件,介绍本次活动并邀请他参加。词数80左右。WelcometoChineseSummerCampTime:July18th—July28th,2024Place:No.8J......
  • LeetCode:21.合并两个有序链表
    LeetCode:21.合并两个有序链表解题思路与归并排序中的合并两个有序数组很相似。将数组替换成链表就能解此题。解题步骤新建一个新链表,作为返回结果。用指针遍历两个有序链表,并比较两个链表的当前节点,较小者先接入新链表,并将指针后移一步。链表遍历结束,返回新链表。/***Defini......
  • flask之 scoped实现线程安全.py
    1、用法导入模块,将Session传入scoped_session即可fromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportscoped_sessionfrommodelsimportUsersfromthreadingimportlocalengine=create_engine("mysql+pymysql:......
  • C18.【C++ Cont】OJ测试用例的各种输入情况汇总
    目录1.思维导图2.单组测试用例3.多组测试用例1.测试数据组已知(输入)类模版例题2.测试数据组未知模版3.特殊值结束测试数据模版1.逐个字符处理2.一次读一行例题4.应对空格的处理方法1.一次读一行模板2.一次读一个单词5.应对数字的处理方法两个认知1.呈现在......
  • 210. 课程表 II【 力扣(LeetCode) 】
    文章目录零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码零、原题链接210.课程表II一、题目描述  现在你总共有numCourses门课需要选,记为0到numCourses-1。给你一个数组prerequisites,其中prerequisites[i]=[ai,bi],表示在选修课......
  • pg_controldata的使用方法
    [omm@txy~]$pg_controldata/openGauss/data/dnpg_controlversionnumber:923Catalogversionnumber:201611171Databasesystemidentifier:5932367657193972969Databaseclusterstate:inproductionpg_contr......
  • VP Codeforces Round 978 (Div. 2)
    A.BustoPénjamo题意:有n个家庭,每个家庭有\(a_i\)个人,现在有r排座位,每个座位可以坐两个人。如果一个人自己一个坐一个座位或者和自己家庭的人坐一个座位,他就会开心,问所有人都入座后最多有多少人开心。我们肯定尽量让一个座位坐两个同一家庭的人,这样一个座位可以让两个人开心。......
  • 关于Ubuntu安装Mujoco的记录
    前言这篇博客主要用于记录一些关于mujoco如何安装、urdf模型如何导入以及如何进行仿真的记录的事情,特此记录,一方面便于日后自己的温故学习,另一方面也比便于大家的学习和交流。如有不对之处,欢迎评论区指出错误,你我共同进步学习!正文让我们安装mujoco1、安装----安装mojoco----......
  • vscode调试中launch.json文件配置
    {  //使用IntelliSense了解相关属性。  //悬停以查看现有属性的描述。  //欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387  "version":"0.2.0",  "configurations":[    {      "name":"(gdb)......