牛客周赛 Round 60

news/2024/9/19 3:39:58/文章来源:https://www.cnblogs.com/Natural-TLP/p/18415902

A-困难数学题

思路

\(x\) \(xor\) \(x\) \(xor\) \(x\) \(xor\) \(x\),异或有结合律,\(x\) \(xor\) \(x\) \(= 0\)\(0\) \(xor\) \(0\) \(= 0\),所以本题直接输出0。

代码

#include <iostream>using namespace std;int main()
{int x;cin >> x;cout << 0;return 0;
}

B-构造序列

思路

正数负数各取一个构造序列,直至某一个值消耗。可以知道,如果正数负数个数之差不超过1,直接输出 \(n + m\) 即可,超过1,则取较少的那个值乘2+1。

代码

#include <iostream>using namespace std;int main()
{int n, m;cin >> n >> m;if (abs(n - m) > 1) cout << min(n, m) * 2 + 1;else cout << n + m;return 0;
}

C-连点成线

思路

题意是求在一行或一列中最大差是多少。可以分别存 \(x,y\) 坐标,再分别跑 \(n\) 行和列,暴力求该行或列的最大差,取一个max值。时间复杂度为\(O(nmlogm)\),但有些行或列是可以不用求的,比如该行或列没有点或只有一个点。

代码

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;const int N = 1e5 + 10;int n, m;
vector<int> gx[N], gy[N];int main()
{cin >> n >> m;for (int i = 0; i < m; i ++){int x, y;cin >> x >> y;gx[x].push_back(y);gy[y].push_back(x);}    int res = 0;for (int i = 1; i <= n; i ++){if (gx[i].size() > 1) {sort(gx[i].begin(), gx[i].end());res = max(res, gx[i].back() - gx[i].front());}if (gy[i].size() > 1) {sort(gy[i].begin(), gy[i].end());res = max(res, gy[i].back() - gy[i].front());}}cout << res;return 0;
}

D-我们N个真是太厉害了

思路

题目大意:给出的n个数是否可以组合1~n以内所有的数。
我的写法假了,但这题没卡,就是考虑dp,大小为i的数是否可以被构成,典型的01背包,但时间复杂度超了,我用了bitset进行优化。

代码

#include <iostream>
#include <bitset>using namespace std;const int N = 1e5 + 10;int n;void solve()
{cin >> n;bitset<N> st;st[0] = 1;for (int i = 0; i < n; i ++){int x;cin >> x;st |= (st << x);}int res= 0;for (int i = 1; i <= n; i ++){if (!st[i]) {res = i;break;}}if (!res) cout << "Cool!" << '\n';else cout << res << '\n';
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t;cin >> t;while (t --) solve();return 0;
}

真思路

将n个数排序后,前i项和\(s_i\)与第i+1项数\(a_{i+1}\)差值不超过1,那么1~\(s_i + a_{i+1}\)是可以被组成的。很容易思考,首先\(s_1\)必等于1,因为必须保证第一位要可组成,而组成1的数只有1,则在第二位,在满足第一位与第二位差值不超1的条件下2或3一定被组成,以此类推,第i个数时数值i一定可以组成,且前i项和也可被组成。

代码

#include <iostream>
#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;int n;
ll a[N];void solve()
{cin >> n;for (int i = 1; i <= n; i ++) cin >> a[i];sort(a + 1, a + 1 + n);ll sum = 0;for (int i = 1; i <= n; i ++)if (sum >= n) break;else if (sum + 1 < a[i]) {cout << sum + 1 << '\n';return ;}else sum += a[i];if (sum < n) {cout << sum + 1 << '\n';return ;}cout << "Cool!" << '\n';
}int main()
{int t;cin >> t;while (t --) solve();return 0;
}

E-折返跑

思路

组合数
n个点,两个杆一开始在1和n上,要绕杆跑m趟,每次可操作一次将左杆右移或右杆左移,在m趟后保证左右杆的方位不变。在去除1和n两个点后剩下n-2个点可以操作,但要求必须操作m-1次(最后一趟到达终点不必在操作),相当于将n-2个球取m-1次,求有多少种取法。那就是C(n-2, m-1)。
因为常规组合数写法是\(O(n^2)\)的,这里必须进行预处理优化,再用公式一步算出。
牛客题解给的组合数封装板子

代码

#include <iostream>using namespace std;typedef long long ll;const int M = 1e6 + 10;
const int mod = 1e9 + 7;int n, m;
ll fact[M + 10], infact[M + 10];ll qmi(int a, int b)
{ll res = 1;while(b){if(b & 1) res = res * a % mod;a = (ll)a * a % mod;b >>= 1;}return res;
}void init()
{fact[0] = infact[0] = 1;for(int i = 1; i <= M; i ++) fact[i] = fact[i - 1] * i % mod;infact[M] = qmi(fact[M], mod - 2);for(int i = M - 1; i >= 1; i --) infact[i] = infact[i + 1] * (i + 1) % mod;
}int C(int a, int b)
{if(b < 0 || a - b < 0) return 0;return fact[a] * infact[b] % mod * infact[a - b] % mod;
}void solve()
{cin >> n >> m;cout << C(n - 2, m - 1) << '\n';
}int main()
{init();int t;cin >> t;while (t --) solve();return 0;
}

F-口吃

牛客官方题解

代码

#include <iostream>using namespace std;typedef long long ll;const int mod = 1e9 + 7;
const int N = 1e5 + 10;int n;
ll a[N], b[N], s[N];
ll f[N];ll qmi(ll a, ll b)
{ll res = 1;while (b){if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}ll inv(ll x) 
{return qmi(x, mod - 2);
}int main()
{cin >> n;for (int i = 1; i < n; i ++) cin >> a[i];for (int i = 1; i < n; i ++) cin >> b[i];for (int i = 1; i < n; i ++) s[i] = (a[i] + b[i]) % mod;f[1] = s[1] * inv(a[1]) % mod;ll res = f[1];for (int i = 2; i < n; i ++){f[i] = (b[i] * b[i] % mod * f[i - 1] % mod + s[i] * s[i] % mod) % mod * inv(a[i] * a[i] % mod) % mod;res = (res + f[i]) % mod;}cout << res + 1;return 0;
}

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

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

相关文章

[JS] ES Modules的运作原理

本文介绍了 ES Modules (ESM) 在浏览器环境中的运行原理,详细阐述了 ESM 的三大加载步骤:构建、实例化、求值,并讨论了其动态加载能力、循环依赖处理方式及与 CommonJS 的区别。ESM 通过 import 语句引入其它依赖,通过 export 语句导出模块成员。 在浏览器环境中,<scri…

Go runtime 调度器精讲(八):sysmon 线程和 goroutine 运行时间过长的抢占

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 在 Go runtime 调度器精讲(七):案例分析 一文我们介绍了一个抢占的案例。从案例分析抢占的实现,并未涉及到源码层面。本文将继续从源码入手,看 Go runtime 调度器是如何实现抢占逻辑的。 1. sysmon 线程 还记得 Go run…

Go runtime 调度器精讲(八):sysmon 线程和运行时间过长的抢占

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 在 Go runtime 调度器精讲(七):案例分析 一文我们介绍了一个抢占的案例。从案例分析抢占的实现,并未涉及到源码层面。本文将继续从源码入手,看 Go runtime 调度器是如何实现抢占逻辑的。 1. sysmon 线程 还记得 Go run…

usb协议

1 USB 信号编码 USB 传输的编码就是 NRZI 格式,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1:翻转的信号本身可以作为一种通知机制,可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB 这种通过差分线来传输的信号方便。

引入语义标签过滤:利用标签相似度增强检索

引入语义标签过滤:利用标签相似度 增强检索 传统的标签搜索缺乏灵活性。如果我们要过滤恰好包含给定标签的样本,可能会出现这样的情况,特别是对于只包含几千个样本的数据库, 可能没有任何(或只有少数)与我们的查询匹配的样本。两种搜索的不同之处在于搜索结果的稀缺性 传统的…

娄涵格第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 介绍自己。自我评估,期待在课程收获什么,担当什么样的角色姓名-学号 娄涵格-2022329301112自我介绍 1、基本信息 大家好,我的名字是娄涵格,来自浙江台州,目前是浙江理工大学22电气工程及其自…

踩坑日志3:每一个epoch都会重新随机采样,固定batch容易使模型陷入局部解

前几天师弟在机器学习领域看到了一个对样本选择的方法,目的是从特征的角度均匀选择样本。如下图所示,首先初始化将样本的特征进行加和并归一化,迭代取出样本(取值最大的那个样本,再令样本的值乘以1-样本的值更新所有样本)。这般便可以从理论上均匀的取到不同分布的样本,…

动态规划——数学模型精解

动态规划是运筹学的一个分支,主要用于求解多阶段决策过程的优化问题。1950年代初,R.E. Bellman提出了最优性原理,将复杂的多阶段问题分解为一系列单阶段问题逐步求解,开创了动态规划这一方法。1957年,他出版了《Dynamic Programming》,成为该领域的经典著作。动态规划自问…

C#实现系统登录

1, 新建窗口frm_Loginusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace WindowsFormsA…

深度学习(FCN)

FCN是全卷积网络,用于做图像语义分割。通常将一般卷积网络最后的全连接层换成上采样或者反卷积网络,对图像的每个像素做分类,从而完成图像分割任务。 网络结构如下:这里并没有完全按照原始网络结构实现,而是尝试upsample和convTranspose2d结合的方式,看看有什么效果。 下…

多线程五-线程通信之wait与notify

wait与notify用于syncronized的线程间通信的一种,wait用来阻塞线程并释放锁,notify用来唤醒线程。他们与condition作用基本一致,但是由于syncronized为jdk实现,阅读源码有难度,所以通过了解其原理,用来帮助我们后续理解condition的源码。 可以通过下面一张图来理解:下面…