2024牛客寒假算法基础集训营1

A

找dfs这三个字符即可

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 55;int n;
char s[N];void solve()
{cin >> n >> s + 1;int pos1 = -1, pos2 = -1, pos3 = -1;int f1 = 1, f2 = 1;for(int i = 1; i <= n; i ++){if(s[i] == 'D'){pos1 = i;break;}}if(pos1 == -1)f1 = 0;for(int i = n; i >= 1; i --){if(s[i] == 'S'){pos3 = i;break;}}if(pos3 == -1)f1 = 0;for(int i = pos1 + 1; i < pos3; i ++){if(s[i] == 'F'){pos2 = i;break;}}if(pos2 == -1)f1 = 0;pos1 = -1, pos2 = -1, pos3 = -1;for(int i = 1; i <= n; i ++){if(s[i] == 'd'){pos1 = i;break;}}if(pos1 == -1)f2 = 0;for(int i = n; i >= 1; i --){if(s[i] == 's'){pos3 = i;break;}}if(pos3 == -1)f2 = 0;for(int i = pos1 + 1; i < pos3; i ++){if(s[i] == 'f'){pos2 = i;break;}}if(pos2 == -1)f2 = 0;cout << f1 << ' ' << f2 << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
} 

B

枚举情况

考虑左右各堵住了几格和特判(1,-1)(1,1)(2,0)这三个点

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;void solve()
{int n;cin >> n;map<PII, int> mp;for(int i = 0; i < n; i ++){int x, y;cin >> x >> y;mp[{x, y}] = 1;}int l = 0, r = 0;for(auto t : mp){int x = t.first.first, y = t.first.second;//cout << "===" << x << ' ' << y << endl;if(y < 0){l = max(l, 1);int tmp = 1;if(x == 1)tmp = 2;if(mp.count({tmp, y - 1}) || mp.count({tmp, y}) || mp.count({tmp, y + 1})){l = 2;}}else if(y > 0){r = max(r, 1);int tmp = 1;if(x == 1)tmp = 2;if(mp.count({tmp, y - 1}) || mp.count({tmp, y}) || mp.count({tmp, y + 1})){r = 2;}}}int res = 4 - l - r;int tmp = 4;if(mp[{2, 0}]){tmp = 2;if(mp[{1, -1}])tmp --;if(mp[{1, 1}])tmp --;if(r == 2)res = min(res, 1);if(l == 2)res = min(res, 1);}res = min(res, tmp);if(mp[{1, -1}]){res = min(res, 2);if(mp[{1, 1}])res = min(res, 1);}if(mp[{1, 1}]){res = min(res, 2);}res = min(res, 3);cout << res << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
} 

C

可以排序然后前缀和预处理出来在哪个人前面插队增加的时间,对每次询问可以二分来找

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;ll a[N], b[N];void solve()
{int n, Q, t;cin >> n >> Q >> t;for(int i = 1; i <= n; i ++)cin >> a[i];sort(a + 1, a + 1 + n);for(int i = 1; i <= n; i ++)a[i] += a[i - 1];for(int i = 1; i <= n; i ++)//第i个时刻前插队 {b[i] = (ll)(n - i + 1) * t;}b[n + 1] = 0;while(Q --){ll x;cin >> x;int l = 1, r = n + 1;while(l < r){int mid = l + r >> 1;if(b[mid] <= x)r = mid;else l = mid + 1;}cout << a[l - 1] + t << endl;}
}int main()
{IOSint _ = 1;//cin >> _;while(_ --){solve();}return 0;
} 

E

范围只有10,可以3的n次方枚举所有情况

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 15;int a[N], b[N];
int q1[N], q2[N];void solve()
{int n, m;cin >> n >> m;for(int i = 1; i <= n; i ++)cin >> a[i];for(int i = 0; i < m; i ++){cin >> q1[i] >> q2[i];}int num = 1;for(int i = 0; i < m; i ++)num *= 3;int ans = 2e9;for(int i = 0; i < num; i ++){for(int j = 1; j <= n; j ++)b[j] = a[j];int t = i;for(int j = 0; j < m; j ++){int A = q1[j], B = q2[j];if(t % 3 == 0){b[A] += 3;}else if(t % 3 == 1){b[B] += 3;}else{b[A] ++;b[B] ++;}t /= 3;}  int x = b[1];sort(b + 1, b + 1 + n);int l = 1, r = n;while(l < r){int mid = l + r + 1 >> 1;if(b[mid] <= x)l = mid;else r = mid - 1;}ans = min(ans, n + 1 - l);}cout << ans << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
} 

F

第二类斯特林数

将n个不同的元素分为k个集合 或者 将n个不同的小球放进k个相同的箱子

S(n, k) = S(n - 1, k) + k * S(n - 1, k)

n=k时为1,S(n, k) = 1

S(n, 0) = 0,特别地S(0, 0) = 1

容斥原理计算公式

S(n,m)=\frac{1}{m!}\sum_{k=0}^{m}(-1)^{k}C(m,k)(m-k)^{n}

搭配快速幂可以mlogn求出来

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010, mod = 1e9 + 7;int n, m;
int fact[N], infact[N], inv[N];int C(int a, int b)
{if(a < b)return 0;return (ll)fact[a] * infact[b] % mod * infact[a - b] % mod;
}ll qmi(ll a, ll k)
{ll res = 1;while(k){if(k & 1)res = res * a % mod;a = a * a % mod;k >>= 1;}return res;
}int main()
{IOSfact[0] = fact[1]= infact[0] = infact[1] = inv[1] = 1;for(int i = 2; i < N; i ++){fact[i] = ((ll)fact[i - 1] * i) % mod;inv[i] = (ll)(mod - mod / i) * inv[mod % i] % mod;infact[i] = (ll)infact[i - 1] * inv[i] % mod;}cin >> n >> m;int sign = 1;ll ans = 0;for(int k = 0; k <= m; k ++){ll res = C(m, k) * qmi(m - k, n) % mod * sign;ans = (ans + res) % mod;sign *= -1;} ans = (ans + mod) % mod;ll tmp = 1;for(int i = 2; i <= m; i ++){tmp = tmp * i % mod;}ans = ans * qmi(tmp, mod - 2) % mod;cout << ans;return 0;
}

G

本金+b[i] >= a[i]时就说明可以买,可以先把所有b[i]加到本金里,然后从最大的a[i]往小枚举,不满足的话就-b[i]

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;PII a[N];bool cmp(PII A, PII B)
{return A.first - A.second < B.first - B.second;
}void solve()
{int n, m;cin >> n >> m;for(int i = 1; i <= n; i ++){int x, y;cin >> x >> y;a[i] = {x, y};}sort(a + 1, a + 1 + n);ll t = m;for(int i = 1; i <= n; i ++){t += a[i].second;}for(int i = n; i >= 1; i --){if(t < a[i].first){t -= a[i].second;}}cout << t << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
} 

H

标题说是背包但其实解法跟背包也没什么关系

如果背包容量为10101  (二进制)

物品重量为10101 10011

如果选了第一个物品第二个就选不了,如果选了第二个第一个就选不了,无法同时选

可以考虑将背包容量的某一位1强制转为0,然后这一位上为1的物品都不选,只要在这一位之前,物品的重量的位为1时背包这一位也为1就说明可选。这一位之后怎么都无所谓的,不论怎么选都会小于原背包容量的

这样在每次过程中每个物品都变成了可选和不可选两种情况。

然后背包原重量也这么来一遍,取一个最大值即可

这样枚举是包含所有情况的

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;int n, m;
int v[N], w[N];void solve()
{cin >> n >> m;for(int i = 1; i <= n; i ++){cin >> v[i] >> w[i];}ll ans = 0;for(int i = 1; i <= n; i ++){if((w[i] | m) == m){ans += v[i];}}while(m){if(m & 1){m >>= 1;ll res = 0;for(int i = 1; i <= n; i ++){if(w[i] & 1){w[i] >>= 1;continue;}w[i] >>= 1;if((w[i] | m) == m){res += v[i];}}ans = max(ans, res);}else {m >>= 1;for(int i = 1; i <= n; i ++)w[i] >>= 1;}}cout << ans << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

I

正统解法其实是看点的分布概率,第一个人的点分布概率是平均的,第二个人的点分布概率是偏中心的。

我想的是算两个人半径的期望,第二个人的期望一定比第一个人的期望大

最终半径的平均值离谁更近就说明是谁,那肯定有一个临界值,我的想法是找这个临界值

或者也可以真的按这两个人的办法分别模拟1e5或者更多次,看期望是多少

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;int main()
{IOSint n;cin >> n;double r = 0;for(int i = 1; i <= n; i ++){double tmp;cin >> tmp >> tmp >> tmp;r += tmp;}r /= (double)n;if(r <= 20.0)cout << "bit-noob";else cout << "buaa-noob";return 0;
}

K

一个题的选项是对应题的答案,可以构建出一个基环树(其实是若干个基环树,或者说森林)。

一个环可以有好几条链,所以从链的起点出发其实不好算,但也可以发现后者答案固定后前者的答案是可以逆推出来的,所以可以从一个环上的任意一个点当成起点出发,枚举A-F选项,如果选项合理就计入答案

最终答案数其实就是每个环的方案数相乘

这里学到了一种很好写的方法,用vector存这次遍历到的所有点,然后看最后一个点的下一个点是否在vector中,如果在就说明有环,把这个点之前的点清除剩下的就是一个环。如果最后一个点的下一个点没在vector中就说明没环(环已经被标记了),非常方便的写法

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010, mod = 998244353;int n;
int a[N];
string s[N];
bool st[N];int main()
{IOScin >> n;for(int i = 1; i <= n; i ++){cin >> a[i] >> s[i];}ll ans = 1;for(int i = 1; i <= n; i ++){if(st[i])continue;int j = i;vector<int> v;for(; !st[j]; j = a[j]){st[j] = true;v.push_back(j);}vector<int>::iterator it = find(v.begin(), v.end(), j);if(it == v.end())continue;v.erase(v.begin(), it);//这样只剩下环里的点了ll res = 0;for(char ch = 'A'; ch <= 'E'; ch ++){int t = ch - 'A';for(auto x : v){t = s[x][t] - 'A';}if(ch - 'A' == t)res ++;}ans = ans * res % mod;}cout << ans;return 0;
}

L

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;ll a[N], b[N];void solve()
{ll c, d, h, w;cin >> c >> d >> h >> w;cout << 3 * w * c << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
} 

M

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 55;void solve()
{int n;cin >> n;if(n % 6){cout << n / 6 * 2 << endl;}else cout << n / 6 << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
} 

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

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

相关文章

LeetCode Python - 1.两数之和

文章目录 题目答案运行结果 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能…

【网站项目】031网络游戏公司官方平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

博途PLC报警字FC(字寄存器按位访问)

博途PLC的字寄存器按位访问和拆分,请查看下面文章链接: https://rxxw-control.blog.csdn.net/article/details/121727057https://rxxw-control.blog.csdn.net/article/details/121727057西门子触摸屏报警都是以字为地址访问,所以离散报警信号我们需要将其组合为报警字输出,…

async 与 await(JavaScript)

目录捏 前言一、async二、await三、使用方法总结 前言 async / await 是 ES2017(ES8) 提出的基于 Promise 解决异步的最终方案。上一篇文章介绍了 回调地狱 与 Promise&#xff08;JavaScript&#xff09;&#xff0c;因为 Promise 的编程模型依然充斥着大量的 then 方法&#…

【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】

文章目录 移位运算与乘法状态机简介SystemVerilog中的测试平台VCS 波形仿真 阻塞赋值和非阻塞赋值有限状态机&#xff08;FSM&#xff09;与无限状态机的区别 本篇文章接着上篇文章【芯片设计- RTL 数字逻辑设计入门 11 – 移位运算与乘法】 继续介绍&#xff0c;这里使用状态机…

MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置

MyBatis之环境搭建以及实现增删改查 前言实现步骤1. 编写MyBatis-config.xml配置文件2. 编写Mapper.xml文件&#xff08;增删改查SQL文&#xff09;3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章&#xff0c;我们…

C++后端开发之Sylar学习二:配置VSCode远程连接Ubuntu开发

C后端开发之Sylar学习二&#xff1a;配置VSCode远程连接Ubuntu开发 没错&#xff0c;我不能像大佬那样直接在Ubuntu上面用Vim手搓代码&#xff0c;只能在本地配置一下VSCode远程连接Ubuntu进行开发咯&#xff01; 本篇主要是讲解了VSCode如何配置ssh连接Ubuntu&#xff0c;还有…

Oracle笔记-为表空间新增磁盘(ORA-01691)

如下报错&#xff1a; 原因是Oracle表空间满了&#xff0c;最好是新增一个存储盘。 #查XXX命名空间目前占用了多大的空间 select FILE_NAME,BYTES/1024/1024 from dba_data_files where tablespace_name XXXX #这里的FILE_NAME能查到DBF的存储位置#将对应的datafile设置为30g…

#免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程

Mac电脑苹果芯片读写NTFS硬盘bash脚本 &#xff08;ntfs.sh脚本内容在本文最后面&#xff09; ntfs.sh脚本可以将Mac系统(苹果M系芯片)上的NTFS硬盘改成可读写的挂载方式&#xff0c;从而可以直接往NTFS硬盘写入数据。此脚本免费&#xff0c;使用过程中无需下载任何收费软件。…

vue教程-介绍与使用

vue介绍 介绍 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 安装 最简单的例子就是&#xff0c;创建一个htm…

云上未来:探索云计算的技术变革与应用趋势

一、云计算的起源和演进 1.1 早期计算模型 在探讨云计算的起源和演进之前&#xff0c;理解早期的计算模型对于构建全面的视角至关重要。早期计算模型的发展奠定了云计算的基础&#xff0c;为其演进提供了技术和理念的支撑。 1.1.1 集中式计算模型 在计算技术的早期阶段&…

JVM Java虚拟机入门指南

文章目录 为什么学习JVMJVM的执行流程JVM的组成部分类加载运行时数据区本地方法接口执行引擎 垃圾回收什么样的对象是垃圾呢内存溢出和内存泄漏定位垃圾的方法对象的finalization机制垃圾回收算法分代回收垃圾回收器 JVM调优参数JVM调优工具Java内存泄漏排查思路CPU飙高排查方案…

私有化部署一个吃豆人小游戏

目录 效果 安装步骤 1.安装并启动httpd 2.下载代码 3.启动httpd 使用 效果 安装步骤 1.安装并启动httpd yum -y install httpd 2.下载代码 进入目录 cd /var/www/html/ 下载 git clone https://gitee.com/WangZhe168_admin/pacman-canvas.git 3.启动httpd syste…

c++阶梯之类与对象(中)< 续集 >

前文&#xff1a; c阶梯之类与对象&#xff08;上&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;-CSDN博客 前言&#xff1a; 在上文中&#xff0c;我们学习了类的六个默认成员函数之构造&#xff0c;析构与拷贝构造函数&#xff0c;接下来我们来看看剩下…

常用的EasyExcel表格处理-2(动态合并、自适应宽高)

EasyExcel官网&#xff1a;点击查看 1、动态合并单元格 此处主要根据自定义处理类ExcelFillCellMergeStrategy进行处理&#xff0c;具体内容可看代码注释。 1.1 前端调用controller PostMapping("/download/template")public void toDoExport(HttpServletResponse…

c#string方法对比

字符串的截取匹配操作在开发中非常常见&#xff0c;比如下面这个示例&#xff1a;我要匹配查找出来字符串数组中以“abc”开头的字符串并打印&#xff0c;我下面分别用了两种方式实现&#xff0c;代码如下&#xff1a; using System; namespace ConsoleApp23{ class Progra…

Android开发 button 按钮点击两次 响应onclick方法

问题 Android开发 button 按钮点击两次 响应onclick方法 详细问题 笔者xml代码 <!-- 一个按钮 --> <Button android:id"id/button1" android:layout_width"wrap_conten…

Rust 第一个rust程序Hello Rust️

文章目录 前言一、vscode 安装rust相关插件二、Cargo New三、vscode调试rustLLDB 前言 Rust学习系列。今天就让我们掌握第一个rust程序。Hello Rust &#x1f980;️。 在上一篇文章我们在macOS成功安装了rust。 一、vscode 安装rust相关插件 以下是一些常用的 Rust 开发插件…

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

《Git 简易速速上手小册》第1章:Git 基础(2024 最新版)

文章目录 1.1 Git 简介&#xff1a;版本控制的演变1.1.1 基础知识讲解1.1.2 重点案例&#xff1a;协作开发流程优化案例&#xff1a;功能开发与分支策略 1.1.3 拓展案例 1&#xff1a;代码审查与合并1.1.4 拓展案例 2&#xff1a;冲突解决 1.2 安装和配置 Git&#xff1a;首次设…