牛客周赛 Round 80

前言

这场比赛是很有意思的,紧跟时事IG杯,大卞"神之举手",0胜拿下比赛,我当时也是完整的看完三场比赛,在第二次说直接两次罚下的时候我真是直接暴起了,然后第三场当时我正在吃饭,看到又整幺蛾子直接恶心的不行,真就离谱,棋虽小道,品德最尊。因为小时候就学过围棋,这种棋盘上的博弈也正像打acm比赛时的紧张刺激一般令我神迷,而韩国棋手在棋道上还是有很长的路要走

正文

棋盖放子

#include <bits/stdc++.h>
using namespace std;
//#define int long long  // 恢复 long long 宏定义
#define N 200005void solve() {int x,y;cin>>x>>y;if(y>x){cout<<"quit the competition!";}elsecout<<x-y;
}signed main() {int T = 1;// cin >> T;while (T--)solve();return 0;
}

比大小输出即可

训练参赛

#include <bits/stdc++.h>
using namespace std;
#define int long long  // 恢复 long long 宏定义
#define N 200005void solve() {int n;cin >> n;vector<int>a(2*n);for (int &x : a)cin >> x;sort(a.begin(), a.end());int ma = 0;for (int i = 0; i < 2*n; i+=2)ma +=a[i+1]-a[i] ;cout << ma;
}signed main() {int T = 1;// cin >> T;while (T--)solve();return 0;
}

先排序,再进行计算即可

举手赢棋easy

#include <bits/stdc++.h>
using namespace std;
//#define int long long  // 恢复 long long 宏定义
#define N 200005void solve() {int n;cin >> n;string s;int w = 0;cin >> s;int ww = 0, ss = 0;int ans = 0, st = 0;for (int i = 1; i <= n; i++) {if (s[i - 1] == '1')ww++;elsess++;if (ss > ww) {if (st == 1) {cout << 0;return;}ans=ss;ww++, ss--;st = 1;}}if (st)cout << ans << endl;elsecout << n << endl;
}signed main() {int T = 1;// cin >> T;while (T--)solve();return 0;
}

        这个题就开始上难度了,题意是说大卞有机会通过举手将一局由输转赢,而且还要求任何时刻都要保证赢的数大于等于输的数。

        这道题需要我们有一些深度的思考

        首先如果一直都是赢的大于输的,那么大卞就可以堂堂正正的获胜,这时候答案其实就是n,任何一把都可以举手

        然后就是如果有一把输的会导致不再是赢大于等于输了,那么这时候就需要强制举手。但是我们需要认识到,实际上这次举手可以用在这个输的一把之前的任何一把输的场都可以。

        最后就是无论如何,用了举手还是输了,也就是在第一次举手之后,后面又出现一次使输大于赢的情况。

举手赢棋hard

#include <bits/stdc++.h>
using namespace std;
#define int long long  // 恢复 long long 宏定义
#define N 200005int c(int x, int q = 2) {return x * (x - 1) / 2;
}void solve() {int n;cin >> n;string s;int w = 0;cin >> s;int ww = 0, ss = 0;int ans1 = 0, ans2, st = 0;for (int i = 1; i <= n; i++)w += s[i - 1] - '0';for (int i = 1; i <= n; i++) {if (s[i - 1] == '1')ww++;elsess++;if (ss > ww) {if (st == 2) {cout << 0;return;}if (st == 0)ans1 = ss;if (st == 1)ans2 = ss+1;ww++, ss--;st ++;}}
//     cout<<ans1<<ans2;int aa = 0,su=n-w;if (st == 2) {aa += c(ans1, 2);aa += ans1 * (ans2 - ans1);} else if (st == 1) {aa += c(ans1, 2);aa += ans1 * (su - ans1);aa += ans1 * w;} else {aa = c(n, 2);}cout << aa;
}signed main() {int T = 1;// cin >> T;while (T--)solve();return 0;
}

这个题在理解前面easy版本的条件下就很简单了,就是可以举两次手。

1,不需要举手,那就是C(n,2),随便选两把就好

2,需要在k把举一次手,那么第一次举手是强制在k把之前的,那么我们可以分类讨论,i,两次都在k把前举手,ii,一次在k前一次在k后,iii,还有一次在k前,第二次在所有赢的里面去举手(这里不好将前两种合并成k前*所有输的次数,因为会重叠,不如分开算)

3.需要举两次手,x举一次,y举一次,那么也是分类 i,在x之前举两次 ii,在x之前一次,在x~y举一次,答案就出来了。

公平对局

#include <bits/stdc++.h>
using namespace std;
// #define int long long  // 恢复 long long 宏定义
#define N 2005
int q[N][N];struct qq {int a, b, x;
};
vector<qq>ans;int f[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int n, s, num, cnt, xxx, yyy;
int st[N][N], st2[N][N];
void dfs(int x, int y) {st[x][y] = 1;num++;for (int i = 0; i < 4; i++) {int xx = x + f[i][0], yy = y + f[i][1];if (xx < 1 || yy < 1 || xx > n || yy > n)continue;if (st[xx][yy] == 1)continue;if (q[xx][yy] == 2) {dfs(xx, yy);} else if (q[xx][yy] == 0) {if (st2[xx][yy] == cnt)continue;st2[xx][yy] = cnt;s++;xxx=xx,yyy=yy;}}
//     cout<<'*'<<x<<' '<<y<<' '<<q[x][y]<<endl;}
struct xx {int x, y, v;
};
void solve() {cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {char c;cin >> c;if (c == '.')q[i][j] = 0;else if (c == '#')q[i][j] = 1;elseq[i][j] = 2;}}int ma = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (q[i][j] == 2 && st[i][j] == 0) {s = 0;num = 0;cnt++;dfs(i, j);
// 				cout<<i<<j<<' '<<num<<' '<<s<<endl;if (s == 1) {ans.push_back({xxx, yyy, num});}}}}map<pair<int, int>, int>mp;for (auto[x, y, z] : ans) {mp[ {x, y}] += z;ma = max(mp[ {x, y}], ma);}cout << ma;
}signed main() {int T = 1;// cin >> T;while (T--)solve();return 0;
}

这道题我可能写的麻烦了一点,最开始想dfs后来莫名其妙总是错,后来就改成并查集进行操作了。首先通过dfs吧所有连成一块的白子作为一个联通块,然后把那些只剩一口气的联通块进行记录(这里有可能是对于两个白子剩的一口气都在同一个位置,那也算一口气而非两口气),并且把他最后一口气的坐标进行记录,就会有几个可以下黑子的地方,然后注意可能一个黑子会把两个块都吃掉,所以我们需要进行一个记录的操作。这个题虽然操作有点难受,但是思路不难理解。

训练参赛(二)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 998244353
#define int long long
const int N = 1e6 + 5;void solve(int q) {int n, k;cin >> n >> k;vector<int>a(n + 1), mp(2 * n + 1);if (k < n || k > n * n) {cout << "-1" << "\n";return;}if ((k + n + 2 * n * n) % 2) {cout << "-1" << "\n";return;}int tmp = 2*n-1;for (int i = 1; i <= n; i++) {while (k - tmp < (n - i))tmp -= 2;a[i] = tmp;k -= tmp;if (tmp > 2)tmp -= 2;}int p = 2 * n;for (int i = 1; i <= n; i++) {while (mp[p])p--;mp[p] = 1, mp[p - a[i]] = 1;cout << p << ' ' << p - a[i] << "\n";}
}signed main() {int T;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);T = 1;cin >> T;for (int i = 1; i <= T; i++) {solve(i);}return 0;
}

这个可以说是最难的一波了,因为思维量挺大的,我们先进行一个举例,n=3时

不难看出,前者为最大值,后者为最小值,所以k能触及的范围就在n~n^2,并且对于前者这个底下的数字的变动不会影响答案,而后者则会

我们可以通过拆除12,56组成新的组合,并且使不和谐度增加,而且我们可以发现我们这次拆除增加了8,去掉了2,所以净增加6,而如果换成 12 34进行操作,那么净增加为2,相当于每个增加1或者3,然后列更多的我们可以发现,我们可以通过这个操作进行增加的净增加都是奇数,而且是1 3 5 7等规律递增的相邻的奇数,这就很有意思了,我们可以想到可不可以用类似二进制表示的方法,对这个k进行拆分成多个奇数表示的形状,然后就可以进行排列了,然后我们就可以把k进行拆分成很多个单独的数,然后我们只要进行一个从大到小按顺序的配对,以得到这些差值即可。

不公平对局

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 1000000007
#define int long long
#define endl '\n'
const int N = 1e3 + 5;
int P1, P2, P3, P4, dp[N][N], aa;int ksm(int x, int n, int m) {int ans = 1;while (n) {if (n & 1)ans = ans * x % m;x = x * x % m;n >>= 1;}return ans;
}int dfs(int x, int y) {if (x == aa)return dp[x][y] = 0;else if (y == aa)return dp[x][y] = 1;if (dp[x][y] != -1)return dp[x][y];return dp[x][y] = (P1 * dfs(x + 1, y + 1)%mod + P2 * dfs(x + 1, y)%mod + P3 * dfs(x, y + 1)%mod) % mod * P4 % mod;
}void solve() {int x, a, b, p1, p2;cin >> aa;cin >> a >> b;p1 = a * ksm(b, mod - 2, mod) % mod;cin >> a >> b;p2 = a * ksm(b, mod - 2, mod) % mod;P1 = (p1 * p2 % mod);P2 = p1 * (1 - p2 + mod) % mod;P3 = (1 - p1 + mod)* p2 %mod;P4 = (1 - p1 + mod) % mod * (1 - p2 + mod) % mod;P4 = ksm(1 - P4 + mod, mod - 2, mod);for (int i = 0; i <= aa; i++) {for (int j = 0; j <= aa; j++)dp[i][j] = -1;}cout << dfs(0, 0) << endl;
}signed main() {int T;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);T = 1;
//	cin >> T;while (T--)solve();return 0;
}

这是一个数学问题,我确实是受益匪浅,但直接嘴上讲讲不动了,建议看一下视频题解

【视频题解】牛客周赛80题目讲解

讲的真好,我有机会还要把他说的题也刷一下,学习一下这种题型(补题预告)

后记

这次比赛还是很有意思的,最起码指向性非常针对,而且大快人心,题型也很有意思。然后就是等着我去补最后一个题的类题就好了

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

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

相关文章

文档格式转换引擎开发:支持PDF与OFD的技术实现

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 近年来&#xff0c;中国在信息技术领域持续追求自主创新和供应链安全&#xff0c;伴随信创上升为国家战略&#xff0c;一些行业也开始明确要求文件导出的格式必须为 OFD 格式。OF…

VSCode Error Lens插件介绍(代码静态检查与提示工具)(vscode插件)

文章目录 VSCode Error Lens 插件介绍**功能概述****开发背景****使用方法****适用场景** VSCode Error Lens 插件介绍 功能概述 Error Lens 是一款增强 VS Code 错误提示的扩展工具&#xff0c;通过 内联显示错误和警告信息&#xff0c;直接定位代码问题&#xff0c;提升开发…

快速幂(算法)的原理

快速幂算法 快速幂数学原理算法实现OJ题展示不用高精度计算二进制指数的高精度计算数学题等差数列和等比数列计数原理 快速幂 求 ( a b ) % n (a^b)\%n (ab)%n的结果&#xff08;即 a a a的 b b b次方&#xff0c;再除以 n n n得到的余数&#xff09;。 利用程序求解时&#…

无人机遥感在农林信息提取中的实现方法与GIS融合应用

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley&#xff1a; 功能 基于HttpUrlConnection;封装了UIL图片加载框架&#xff0c;支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动&#xff08;Activity结束生命周期同时取消所有网络请求 …

【油猴脚本/Tampermonkey】DeepSeek 服务器繁忙无限重试(20250214优化)

目录 一、 引言 二、 逻辑 三、 源代码 四、 添加新脚本 五、 使用 六、 BUG 七、 优化日志 1.获取最后消息内容报错 2.对话框切换无法正常使用 一、 引言 deepseek演都不演了&#xff0c;每次第一次提问就正常&#xff0c;后面就开始繁忙了&#xff0c;有一点阴招全…

C++ Primer 函数重载

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【c++初阶】类和对象②默认成员函数以及运算符重载初识

目录 ​编辑 默认成员函数&#xff1a; 构造函数 构造函数的特性&#xff1a; 析构函数&#xff1a; 拷贝构造函数&#xff1a; 1. 拷贝构造函数是构造函数的一个重载形式。 2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用&#xff0c;使用传值方式编译器直接报…

基于AIOHTTP、Websocket和Vue3一步步实现web部署平台,无延迟控制台输出,接近原生SSH连接

背景&#xff1a;笔者是一名Javaer&#xff0c;但是最近因为某些原因迷上了Python和它的Asyncio&#xff0c;至于什么原因&#xff1f;请往下看。在着迷”犯浑“的过程中&#xff0c;也接触到了一些高并发高性能的组件&#xff0c;通过简单的学习和了解&#xff0c;aiohttp这个…

【鸿蒙HarmonyOS Next实战开发】lottie动画库

简介 lottie是一个适用于OpenHarmony和HarmonyOS的动画库&#xff0c;它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画&#xff0c;并在移动设备上进行本地渲染。 下载安裝 ohpm install ohos/lottieOpenHarmony ohpm 环境配置等更多内容&#xff0c…

UE_C++ —— UObject Instance Creation

目录 一&#xff0c;UObject Instance Creation NewObject NewNamedObject ConstructObject Object Flags 二&#xff0c;Unreal Object Handling Automatic Property Initialization Automatic Updating of References Serialization Updating of Property Values …

PHP本地商家卡券管理系统

本地商家卡券管理系统 —— 引领智慧消费新时代 本地商家卡券管理系统&#xff0c;是基于ThinkPHPUni-appuView尖端技术匠心打造的一款微信小程序&#xff0c;它彻底颠覆了传统优惠方式&#xff0c;开创了多商家联合发行优惠卡、折扣券的全新模式&#xff0c;发卡类型灵活多变…

什么是HTTP Error 429以及如何修复

为了有效管理服务器资源并确保所有用户都可以访问&#xff0c;主机提供商一般都会对主机的请求发送速度上做限制&#xff0c;一旦用户在规定时间内向服务器发送的请求超过了允许的限额&#xff0c;就可能会出现429错误。 例如&#xff0c;一个API允许每个用户每小时发送100个请…

无人机不等同轴旋翼架构设计应用探究

“结果显示&#xff0c;对于不等组合&#xff0c;用户应将较小的螺旋桨置于上游以提高能效&#xff0c;但若追求最大推力&#xff0c;则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中&#xff0c;Max Miles和Stephen D. Prior博士深入探讨了不同螺…

节目选择器安卓软件编写(针对老年人)

文章目录 需求来源软件界面演示效果源码获取 对爬虫、逆向感兴趣的同学可以查看文章&#xff0c;一对一小班教学&#xff1a;https://blog.csdn.net/weixin_35770067/article/details/142514698 需求来源 由于现在的视频软件过于复杂&#xff0c;某客户想开发一个针对老年人、…

Vue的简单入门 一

声明&#xff1a;本版块根据B站学习&#xff0c;创建的是vue3项目&#xff0c;用的是vue2语法风格&#xff0c;仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…

【动手学强化学习】03马尔可夫决策过程

马尔可夫决策过程始终贯穿强化学习&#xff0c;要学好强化学习&#xff0c;必须掌握马尔可夫决策过程的基础知识。与多臂老虎机不同&#xff0c;马尔可夫决策过程包含状态信息以及状态转移机制。 马尔可夫过程 当且仅当某时刻的状态只取决于上个时刻的状态时&#xff0c;一个…

RabbitMQ学习—day2—安装

目录 普通Linux安装 安装RabbitMQ 1、下载 2、安装 3. Web管理界面及授权操作 Docker 安装 强力推荐学docker&#xff0c;使用docker安装 普通Linux安装 安装RabbitMQ 1、下载 官网下载地址&#xff1a;https://www.rabbitmq.com/download.html(opens new window) 这…

SQL Server的安装和简单使用

目录 一、SQL Server 1.1、简介 1.2、安装包 二、安装SQL Server 2.1、双击安装包 2.2、选择自己想要安装的位置 2.3、点击安装 2.4、安装完成之后会出现以下页面&#xff0c;按照序号依次点击 2.5、不用管密钥&#xff0c;点击下一步 2.6、选择【我接受】 2.7、是否…

前缀和(Prefix Sum)算法笔记C++

前缀和(Prefix Sum)算法介绍 前缀和是一种预处理技术, 用于快速计算数组中任意子区间的元素之和. 它通过一次遍历创建一个辅助数组来存储从数组起始位置到当前索引位置所有元素的累加和, 从而使得后续查询操作的时间复杂度降低至 O ( 1 ) O(1) O(1). 定义 对于给定的数组 n…