B. 进制

jbgg 今天在幼儿园学了进制转换,现在 jbgg 有一个十进制正整数 \(x\),jbgg 好奇是否存在这样一个进制 \(p\),使得 \(x\) 在 \(p\) 进制表示下的各个位上的数相加等于 \(y\)

\(2⩽x⩽10^{10}, 1⩽y⩽⌊\frac{x}{2}⌋\)

\(2⩽p⩽10^{18}\)

题解:构造

  • \(a_0+a_1p^1+...=x\)
  • \(a_0+a_1+...=y\)
  • 我们考虑这样一种构造的方法:
  • \(a_1=1\),\(a_0+p=x\),\(a_0+1=y\)
  • \(p = x - y + 1\)
  • 显然\(p\)在合法的范围内
void solve()
{
int x, y;
cin >> x >> y;
cout << x - y + 1 << endl;
}

神奇的骰子

jbgg 在打一个 boss,现在他需要通过投掷一个神奇的骰子来增加自己的攻击力来打败这个 boss。这个骰子有 \(n\) 面,投掷它将等概率地投出 \(1\) 到 \(n\) 中的任意一个数字。

他可以按顺序执行如下操作:

  1. 从 \(1\) 到 \(n\) 中选不同的 \(k (1⩽k⩽n)\) 个数字;
  2. 消耗一次投掷次数,投掷一次骰子,直到没有投掷次数。对于每次投掷,假设投出的数字为 \(d\),且 \(d\) 在所选的 \(k\) 个数字之中,那么可以增加 \(d\) 点攻击力且获得一次投掷次数,否则将无事发生。

现在 jbgg 只有一次投掷次数了,他希望他增加的攻击力的期望不小于 \(x\),由于选择越大的 \(k\) 所需付出的代价越大,他希望这个 \(k\) 尽量的小,你能告诉他 \(k\) 应该选多少吗?

题解:概率与期望 + 二分

  • 为了使得提升的攻击力尽可能多,我们一定会选择\(k\)个最大的数
  • 那么每次投掷有\(\frac{k}{n}\)的概率增加攻击力\(\frac{n-k+1+n-k+1+...+n-k+k}{k}=\frac{n-k+1+n}{2}\)
  • 投掷次数为1的概率为1,投掷次数为\(2\)的概率为\(\frac{k}{n}\)...投掷次数为\(i\)的概率为\((\frac{k}{n})^i\)
  • 那么投掷次数的期望为\(\sum_{i=0}^{\infty}(\frac{k}{n})^i = \frac{n}{n-k}\)(利用等比数列求和公式)
  • 所以每次\(k\)所能增加的攻击力的期望为\(\frac{k}{n} \times \frac{n-k+1+n}{2} \times \frac{n}{n-k} = \frac{k(n-k+1+n)}{2(n-k)}\)
  • 二分出最小的\(k\)即可
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10; int n, x; bool check(int mid)
{
int res = 0;
if (n == mid)
return true;
res = (mid * (n - mid + 1 + n)) / (2 * (n - mid));
return res >= x;
} void solve()
{
cin >> n >> x;
int l = 1, r = n;
while (l <= r)
{
int mid = l + r >> 1;
if (check(mid))
r = mid - 1;
else
l = mid + 1;
}
cout << l << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}

yyjj 的 windows 作业

yyjj 在为她的 windows 期末作业发愁,她决定写一个这样的小游戏:

有一个 \(n\) 行 \(m\) 列的矩形地图,开始有一个长宽均为 \(1\),高为 \(2\) 的长方体竖直地立在 \((1,1)\) 单元格 (也就是 \(1×1\) 的那面与单元格 \((1,1)\) 接触)。玩家需要滚动长方体,使长方体到达的矩阵格点数量尽可能地多。

地图中有些单元格有障碍物,长方体在滚动过程中不能碰到障碍物。此外,长方体的任何部位都不能超出矩形地图的边界。保证单元格 \((1,1)\) 不存在障碍物,长方体可以接触到一个单元格任意多次。

yyjj 想知道通过滚动长方体的方式最多能接触到多少单元格。

\((1⩽n,m⩽100)\)

\(0\) 表示地图的这个单元格有障碍;\(1\) 表示地图的这个单元格没障碍。

题解:多状态DFS + 状态机模型

  • 该题重点在于搜索状态的设置
  • 我们可以设置多个状态表示当前方格上的方块是横着的、竖着的还是立着的,并且如果是横着的或者竖着的,当前方块上是可以往左侧立起来的还是可以往右侧立起来的
  • 然后我们模拟其翻滚时状态的变化,得到状态机
  • 比如说当前是横着的状态,可以继续保持横着的状态或者想立着的状态转移
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 1e2 + 10, M = 4e5 + 10; int n, m;
char g[N][N];
bool mp[N][N][4][2];
// state1代表位于(x,y)的方块的状态是竖着的、横着的还是立着的,state2代表如果是横着或者竖着的状态下,现在是左边的部分还是右边的部分
// 1-竖 2-横 3-立
// 1-左边,0-右边 / 1-上边,0-下边
void dfs(int x, int y, int state1, int state2)
{
if (x < 1 || x > n || y < 1 || y > m || g[x][y] == '0')
return;
if (state1 == 3)
{
if (mp[x][y][state1][0] || mp[x][y][state1][1])
return;
}
else
{
if (mp[x][y][state1][state2])
return;
} mp[x][y][state1][state2] = true;
if (state1 == 3)
{
if (x + 2 >= 1 && x + 2 <= n && y >= 1 && y <= m && g[x + 1][y] != '0' && g[x + 2][y] != '0')
{
dfs(x + 1, y, 1, 1);
dfs(x + 2, y, 1, 0);
} if (x - 2 >= 1 && x - 2 <= n && y >= 1 && y <= m && g[x - 1][y] != '0' && g[x - 2][y] != '0')
{
dfs(x - 1, y, 1, 0);
dfs(x - 2, y, 1, 1);
} if (x >= 1 && x <= n && y + 2 >= 1 && y + 2 <= m && g[x][y + 1] != '0' && g[x][y + 2] != '0')
{
dfs(x, y + 1, 2, 1);
dfs(x, y + 2, 2, 0);
} if (x >= 1 && x <= n && y - 2 >= 1 && y - 2 <= m && g[x][y - 1] != '0' && g[x][y - 2] != '0')
{
dfs(x, y - 1, 2, 0);
dfs(x, y - 2, 2, 1);
}
}
else if (state1 == 2 && state2 == 0)
{
// 保持横着的状态
if (x - 1 >= 1 && x - 1 <= n && y >= 1 && y <= m && g[x - 1][y] != '0' && g[x - 1][y - 1] != '0')
dfs(x - 1, y, 2, 0);
if (x + 1 >= 1 && x + 1 <= n && y >= 1 && y <= m && g[x + 1][y] != '0' && g[x + 1][y - 1] != '0')
dfs(x + 1, y, 2, 0); // 变成立着的状态
if (x >= 1 && x <= n && y + 1 >= 1 && y + 1 <= m && g[x][y + 1] != '0')
dfs(x, y + 1, 3, 1);
}
else if (state1 == 2 && state2 == 1)
{
// 保持横着的状态
if (x - 1 >= 1 && x - 1 <= n && y >= 1 && y <= m && g[x - 1][y] != '0' && g[x - 1][y + 1] != '0')
dfs(x - 1, y, 2, 1);
if (x + 1 >= 1 && x + 1 <= n && y >= 1 && y <= m && g[x + 1][y] != '0' && g[x + 1][y + 1] != '0')
dfs(x + 1, y, 2, 1);
// 变成立着的状态
if (x >= 1 && x <= n && y - 1 >= 1 && y - 1 <= m && g[x][y - 1] != '0')
dfs(x, y - 1, 3, 1);
}
else if (state1 == 1 && state2 == 0)
{
// 保持竖着的状态
if (x >= 1 && x <= n && y + 1 >= 1 && y + 1 <= m && g[x][y + 1] != '0' && g[x - 1][y + 1] != '0')
dfs(x, y + 1, 1, 0);
if (x >= 1 && x <= n && y - 1 >= 1 && y - 1 <= m && g[x][y - 1] != '0' && g[x - 1][y - 1] != '0')
dfs(x, y - 1, 1, 0);
// 变成立着的状态
if (x + 1 >= 1 && x + 1 <= n && y >= 1 && y <= m && g[x + 1][y] != '0')
dfs(x + 1, y, 3, 1);
}
else if (state1 == 1 && state2 == 1)
{
// 保持竖着的状态
if (x >= 1 && x <= n && y + 1 >= 1 && y + 1 <= m && g[x][y + 1] != '0' && g[x + 1][y + 1] != '0')
dfs(x, y + 1, 1, 1);
if (x >= 1 && x <= n && y - 1 >= 1 && y - 1 <= m && g[x][y - 1] != '0' && g[x + 1][y - 1] != '0')
dfs(x, y - 1, 1, 1);
// 变成立着的状态
if (x - 1 >= 1 && x - 1 <= n && y >= 1 && y <= m && g[x - 1][y] != '0')
{
dfs(x - 1, y, 3, 1);
}
}
} void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
cin >> g[i][j];
dfs(1, 1, 3, 1);
int ans = 0;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (mp[i][j][1][0] || mp[i][j][1][1] || mp[i][j][2][0] || mp[i][j][2][1] || mp[i][j][3][0] || mp[i][j][3][1])
ans++;
cout << ans << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}

区间反转

jbgg 有一个长为 \(n\) 的排列,jbgg 每次只能在排列中选择任意一段连续区间进行反转。

jbgg 想用不超过 \(2n\) 次操作使得该排列递增,请你帮助他。只要在你的输出结束后能使排列递增即可通过。

题解:思维

  • 我们考虑下面这种情况:
  • 如果我们想要交换\(l\)和\(r\)处的值,我们可以先反转\([l,r]\),然后再反转\([l+1,r-1]\),这样的话就只交换了\(l\)和\(r\)处的值,其他位置保持不变
  • 那么我们可以从前往后遍历排列,将对应该位置的值交换过来,然后将中间的区间在反转一次,我们发现最多反转的次数不超过\(2n\)次
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10; int n;
int a[N];
unordered_map<int, int> mp;
vector<pii> ans; void solve()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
mp[a[i]] = i;
}
for (int i = 1; i <= n; ++i)
{
if (a[i] != i)
{
ans.push_back({i, mp[i]});
if (mp[i] - i > 2)
ans.push_back({i + 1, mp[i] - 1});
int t1 = a[i], t2 = a[mp[i]];
swap(a[i], a[mp[i]]);
swap(mp[t1], mp[t2]);
}
}
cout << ans.size() << endl;
for (auto &[x, y] : ans)
cout << x << " " << y << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}

ZAFU五月多校合训的更多相关文章

  1. 多校寒训TaoTao要吃鸡dp

    题目描述 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了, 和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包 之后可以多携带h(h为0代表没有装备背包)重量 ...

  2. 前台给后台传JSON字符串,后台解析并保存

    前台 function BMSure() { var DanWeiName = $("[id$='BusinessName']").val(); var Address = $(& ...

  3. 牛客-2018多校算法第五场D-集合问题+并查集

    集合问题 题意: 给你a,b和n个数p[i],问你如何分配这n个数给A,B集合,并且满足: 若x在集合A中,则a-x必须也在集合A中. 若x在集合B中,则b-x必须也在集合B中. 思路:并查集操作,自 ...

  4. 自律训练法 John Sehorz

    自律训练法,系1932年由德国精神医学医师John Sehorz所创立.他研究人们在催眠催眠状态下,所呈现的生理状态,如:沉重与温暖感.. ,因而,John Sehorz改以「逆向操作」之方式,由自我 ...

  5. 牛客网暑期ACM多校训练营(第一场)I Substring

    题意:给你一个只有abc的字符串,求不相同的子串,(不同构算不同,例如aba和bab算同构) 题解:很显然,如果不考虑同构的问题,我们直接上sa/sam即可,但是这里不行,我们考虑到只有abc三种字符 ...

  6. “融而开放、合以创新”T-HIM融合通信技术开发实战

    本文来自腾讯云技术沙龙,本次沙龙主题为T-HIM融合通信技术开发实战 2018年,企业的数字化转型大规模兴起,"数字化经济"时代来临.如何利用数字化技术来支持业务的转型.增长与创新 ...

  7. [转] Raspberry Pi 樹莓派使用場合及時機

    在買了 Raspberry Pi 後,到底能拿來做什麼事情呢?有幾個想法一起分享   這裡有初學者教學的影片,非常值得一看. http://www.youtube.com/user/Raspberry ...

  8. 日语能力考试N2必备训读动词

    日语能力考试N2必备训读动词 ア合う——あう——「自」合一.合到一起.准确味わう——あじわう——「他」品味.品尝預かる——あずかる——「他」照顾.保管.承担預ける——あずける——「他」寄存.处理难以了 ...

  9. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  10. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

随机推荐

  1. babel-preset-env与stage-x的使用指南

    babel介绍 babel总共分为3个阶段: 解析.转换和生成 babel本身不具有任何转换功能, 如果没有plugin,那么经过babel的代码和输入的是相同的. babel插件分为两种 语法插件: ...

  2. Redis入门 - C#|.NET Core封装Nuget包

    经过前面章节的学习,可以说大家已经算Redis开发入门了.已经可以去到项目上磨砺了. 但是今天我还想和大家分享一章:封装自己的Redis C#库,然后打包成Nuget包. 首先要说明的是:不是要自己开 ...

  3. LoRaWAN网关价格干穿地板了

    废话不多说,不要998,不要688,以太网版本只要398,4G版本只要498. 先上图片 1.1 产品特点 ◆ 高性能嵌入式硬件平台 ◆ 使用工业级 Cat.1 4G 模块 ◆ 宽压输入 DC 9-2 ...

  4. 如何用VMWARE创建一个Linux虚拟机

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,我们都是需要接触Linux服务器的,一般部署应用都是部署在Linux服务器上的~ 但一般的服务器要么需要购买,要么只是公司里的,那么有没有免费的L ...

  5. SimpleRAG-v1.0.3:增加文件对话功能

    Kimi上有一个功能,就是增加文件之后对话,比如我有如下一个私有文档: 会议主题:<如何使用C#提升工作效率> 参会人员:张三.李四.王五 时间:2024.9.26 14:00-16:00 ...

  6. Kubernetes ReplicaSet 控制器(十九)

    前面我们一起学习了 Pod 的原理和一些基本使用,但是在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望 ...

  7. 【赵渝强老师】管理Docker镜像

    一.什么是Docker的镜像 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙 ...

  8. `std::packaged_task`、`std::thread` 和 `std::async` 的区别与联系

    std::packaged_task.std::thread 和 std::async 的区别与联系 std::packaged_task.std::thread 和 std::async 都是 C+ ...

  9. [摘录] WebView2 与 JS 交互

    https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/gettingstarted/win32 步骤 5-脚本 托管应用还可以将 JavaS ...

  10. 云原生周刊:优化 Uber 的持续部署丨2024.10.14

    开源项目推荐 Cog Cog 是将机器学习模型打包到容器的工具.可通过配置将机器学习模型所需的环境和依赖,自动打包到容器里方便部署,让你不再为编写 Docker 文件和 CUDA 而痛苦,还能自动启动 ...