AtCoder Beginner Contest 340

前面两道阅读理解直接跳过

C - Divide and Divide

大意

黑板上有一个数n

执行下列操作,直到黑板上的数全为1:

  • 选择一个不小于2的整数x,擦掉。
  • 写下\lfloor \frac{x}{2} \rfloor\lceil \frac{x}{2} \rceil
  • 需要x的代价。

当不能继续操作时,总代价是多少?

思路

定义dp_i表示黑板上初始出现数字i的代价,则有dp_i=dp_{\lfloor \frac{x}{2}\rfloor}+dp_{\lceil \frac{x}{2}\rceil} + x

但是数很大,不能递推,需要记忆化搜索(有用的总状态数不会超过2\log n)。

使用map进行记忆化即可。

代码

#include <iostream>
#include <unordered_map>
using namespace std;typedef long long ll;
unordered_map<ll, ll> dp;ll dfs(ll x) {if (x < 2) return 0;if (dp.count(x)) return dp[x];return dp[x] = x + dfs(x / 2) + dfs((x + 1) / 2);
}int main() {ll n;cin >> n;cout << dfs(n) << endl;return 0;
}

D - Super Takahashi Bros.

大意

n个关卡,初始只能玩第1关。

对于第i关卡,有两种通关方式:

  • 花费A_i时间打完,跳到第i+1关。
  • 花费B_i时间打完,跳到第X_i关。

思路

转化为有向图,对于第i关卡,

  • 在点i和点i+1之间,建一条权值为A_i的边。
  • 在点i和点X_i之间,建一条权值为B_i的边。

最后跑一遍从1n的最短路即可。

代码

#include <iostream>
#include <queue>
#include <utility>
#include <cstring>
using namespace std;const int N = 2e5 + 9;
typedef long long ll;
typedef pair<ll, ll> pll;
ll n, a[N], b[N], x[N], dis[N];
bool vis[N];
priority_queue<pll, vector<pll>, greater<pll>> q;int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;for (ll i = 1; i <= n - 1; i++) cin >> a[i] >> b[i] >> x[i];memset(dis, 0x3f, sizeof dis);dis[1] = 0;q.push({ 0, 1 });while (q.size()) {auto t = q.top();q.pop();ll u = t.second;if (vis[u]) continue;vis[u] = true;ll v = u + 1;if (dis[v] > dis[u] + a[u]) {dis[v] = dis[u] + a[u];q.push({ dis[v], v });}v = x[u];if (dis[v] > dis[u] + b[u]) {dis[v] = dis[u] + b[u];q.push({ dis[v], v });}}cout << dis[n] << endl;return 0;
}

E - Mancala 2

大意

n个盒子,第i个盒子有A_i个球。

依次执行以下操作共m次:

  • i次操作,将第B_i个盒子的所有球均分,多余的球从第B_i+1个盒子开始依次放一个。
  • 如果处理到最后一个盒子还没放完,从第1个盒子开始继续放。

问最后每个盒子的球数量。

思路

假设被取出球的盒子为x,取出了y个球,则放球时相当于:

  • 先给每个盒子\lfloor \frac{y}{n} \rfloor个球
  • 把剩下y \mod n个球依次放入对应盒子。(注意分成两个部分算)

这是一个单点查询单点修改区间修改的操作,使用树状数组+差分维护即可。

代码

#include<iostream>
#include<vector>
using namespace std;
#define int long longtemplate<class T>
struct fenwick{vector<T> tr;int n;fenwick(int _n): n(_n){tr.resize(n + 1);}void add(int a, T b){while(a <= n){tr[a] += b;a += (a & -a);}}T ask(int a){T res{};while(a){res += tr[a];a -= (a & -a);}return res;}
};signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;cin >> n >> m;fenwick<int> fwk(n + 1);for(int i = 1; i <= n; i++){int x; cin >> x;fwk.add(i, x);fwk.add(i + 1, -x);}while(m--){int x; cin >> x; x++;int y = fwk.ask(x);fwk.add(x, -y), fwk.add(x + 1, y);fwk.add(1, y / n), fwk.add(n + 1, -y / n);fwk.add(x + 1, 1), fwk.add(min(n, x + y % n) + 1, -1);if(x + y % n > n) fwk.add(1, 1), fwk.add(y % n - (n - x) + 1, -1);}for(int i = 1; i <= n; i++) cout << fwk.ask(i) << " ";return 0;
}

F - S = 1

大意

给定点(x,y),求一整数点(a,b),使得(0,0),(a,b),(x,y)形成的三角形的面积为1

思路

画一张图:

明显这个三角形面积等于这个长方形的面积减去周边三个小三角形的面积。

S=ay-\dfrac{ab}{2}-\dfrac{xy}{2}-\dfrac{(a-x)(y-b)}{2}

化简可得S=\dfrac{ay-bx}{2},但由于要考虑第二象限,所以S应为|\dfrac{ay-bx}{2}|

使用扩展欧几里德求|ay-bx|=2的一组特解即可。

无解情况:如果2 \mod \gcd(a,b) \ne 0,那么无解。

代码

#include<iostream>
using namespace std;
#define int long longint exgcd(int a, int b, int &x, int &y){if (!b){x = 1; y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= (a / b) * x;return d;
}signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int x, y, a, b;cin >> a >> b;int d = exgcd(a, b, y, x);x = -x;if(2 % d) cout << -1 << endl;else{x = x * (2 / d);y = y * (2 / d);cout << x << ' ' << y << endl;}return 0;
}

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

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

相关文章

【数学建模】优劣解距离法Topsis模型(含MATLAB代码)

TOPSIS法&#xff0c;全称 Technique for Order Preference by Similarity to an Ideal Solution&#xff0c;是由C.L.Hwang和K.Yoon于1981年首次提出的 。这是一种多目标决策分析中常用的有效方法&#xff0c;也被称作优劣解距离法 。 TOPSIS法的基本原理是通过检测评价对象与…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述&#xff08;脚本&#xff09; 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署&#xff0c;那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

书生·浦语2.0(InternLM2)大模型实战--Day04 XTuner微调 | 1.8B 多模态Agent(Part 2: 多模态部分)

视频地址&#xff1a; https://b23.tv/QUhT6ni课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 1. XTuner多模态训练与测试 在本节课中&…

[已解决]react打包部署

react打包部署 问题 npm install 命令无反应 思路 换成 yarn install 安装完hadoop的环境后&#xff0c;使用node的yarn会报错&#xff1a; 我们在cmd使用where yarn&#xff0c;如下&#xff1a; 看你想保留哪一个&#xff0c;我平时node用的多&#xff0c;就把hadoop的y…

Spring Boot中接收各种各样的参数

一、接收json参数&#xff0c;封装为Map 1.1、核心代码 /*** 接收json参数&#xff0c;封装为Map* param servletRequest* return* throws Exception*/ PostMapping("/getParam") public R getParam(HttpServletRequest servletRequest) throws Exception {Map<…

mysql基础19——日志

日志 mysql的日志种类非常多 通用查询日志 慢查询日志 错误日志 与时间有关联 二进制日志 中继日志 与主从服务器的同步有关 重做日志 回滚日志 与数据丢失有关 通用查询日志 记录了所有用户的连接开始时间和截至时间 以及给mysql服务器发送的所有指令 当数据异常时&…

个人开发 App 最简单方法:使用现代开发工具和平台

在移动应用市场的蓬勃发展下&#xff0c;个人开发者也有机会将自己的创意转化为实际的应用程序&#xff0c;并通过应用商店实现盈利。然而&#xff0c;对于许多初学者来说&#xff0c;如何开始个人开发一个应用可能会感到困惑。本文将介绍个人开发 App 的最简单方法&#xff0c…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一&#xff1a;正式之前先回顾数据结构中的双向循环链表 二&#xff1a;list的简介 三&#xff1a;STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

独立样本t检验——python完整代码(直接运行就行)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Author : 三十二画生JH # Contact : fjhstudent163.com # Software: PyCharm # Time : 2024/4/21 21:49 # Site : 网址 # File : t_test.py # Version : # ---功能描述 """ 对实验数据做独立样本&am…

Linux系统维护:增加空闲内存的大小,以便进程有足够的基础内存(空闲内存)来运行

目录 一、问题 二、解决思路 &#xff08;一&#xff09;问题分析 &#xff08;二&#xff09;思路 1. 清理缓存 2. 结束不必要的进程 3. 优化应用程序和服务 4. 增加物理内存 5、注意事项 三、实际处理 &#xff08;一&#xff09;结束不必要的程序 &#xff08;二…

4.21java聊天室项目小结

基本完成了用户的登录注册功能&#xff0c;可以实现用户账号登录和邮箱登录功能&#xff0c;忘记密码通过邮箱发送验证码找回&#xff0c;注册账号功能&#xff0c;并传递给客户端更新数据库的表内容 注册功能&#xff1a; 注册成功后密码进行MD5加密并通过服务器保存到数据库…

【FFmpeg】视频与图片互相转换 ( 视频与 JPG 静态图片互相转换 | 视频与 GIF 动态图片互相转换 )

文章目录 一、视频与 JPG 静态图片互相转换1、视频转静态图片2、视频转多张静态图片3、多张静态图片转视频 二、视频与 GIF 动态图片互相转换1、视频转成 GIF 动态图片2、 GIF 动态图片转成视频 一、视频与 JPG 静态图片互相转换 1、视频转静态图片 执行 ffmpeg -i input.mp4 …