ZAFUACM - 23.8.5个人赛补题

文章目录

  • A - Lucky Conversion
    • 题意
    • 思路
    • 代码
  • B - Constanze's Machine
    • 题意
    • 思路
    • 代码
  • C - Maximum Median
    • 题意
    • 思路
    • 代码
  • D - Remove Extra One
    • 题意
    • 思路
    • 代码
  • E - A Determined Cleanup
    • 题意
    • 思路
    • 代码
  • F - Minimal k-covering

A - Lucky Conversion

原题链接

题意

给出两个只包含“4”和“7”的字符串,每次操作可以任选其一:

  • 把“4”变成“7”或者把“7”变成“4”
  • 交换两个数位置

问从第一个字符串至少经过多少次操作能变成第二个字符串

思路

遍历字符串,存储:
cnt:两个字符串有多少位上的数字不一样
a4:a 字符串中有多少个4
b4:b 字符串中有多少个4

然后看两个字符串4和7的个数是否一样:

  • 如果一样就只需要靠交换顺序来变换:最少的操作数就是cnt / 2,因为每交换一次可以改变两个位置
  • 如果不一样要先把个数调整成一样:调整的原则是,改变那些对应位置上数字不一样的,也就需要调整abs(a4 - b4)次,如果此时还有对应位置上数字不一样的情况,就进行内部交换,再加上(cnt - abs(a4 - b4)) / 2

代码

#include <bits/stdc++.h>using namespace std;int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);string a, b;cin >> a >> b;int cnt = 0;int a4 = 0, b4 = 0;for (int i = 0; i < a.size(); i ++ ){if (a[i] != b[i]) cnt ++ ;if (a[i] == '4') a4 ++ ;if (b[i] == '4') b4 ++ ;}if (a4 == b4) cout << cnt / 2;else{int ans = 0;ans += abs(a4 - b4);if (cnt > abs(a4 - b4)) ans += (cnt - abs(a4 - b4)) / 2;cout << ans;}
}

B - Constanze’s Machine

原题链接

题意

机器会让所有的“m”变成“nn”,所有的“w”变成“uu”
现在给出一个字符串,判断这个字符串本来有多少种可能的样子
如果这不可能是机器输出的字符串就输出0

思路

首先判断字符串中有没有“w”或者“m”,有的话直接输出0,因为机器不可能输出这两个字母

然后找到并记录每个连续的“u”序列或者“n”序列,最后的方案数就是每一段序列的方案数的乘积

现在要解决的问题变成了每一段的方案数是多少,稍微枚举一下就能发现,这一段有几个连续的“w”或“n”,这一段的方案数就是斐波那契数列f[i],于是问题就解决了~

代码

#include <bits/stdc++.h>using namespace std;using i64 = unsigned long long;const i64 mod = 1e9 + 7;
const int N = 100010;int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);// 打表算出斐波那契数列i64 f[N];f[1] = 1, f[2] = 2;for (int i = 3; i <= N; i ++ )f[i] = (f[i - 1] + f[i - 2]) % mod;string s;cin >> s;for (int i = 0; i < s.size(); i ++ )if (s[i] == 'w' || s[i] == 'm') {cout << 0;return 0;}vector<int> cnt;int flag = 1;for (int i = 0; i < s.size(); i ++ ){if (i == 0) continue;if (s[i] == s[i - 1] && (s[i] == 'n' || s[i] == 'u')) flag ++ ;else{cnt.push_back(f[flag]);flag = 1;}}cnt.push_back(f[flag]);i64 ans = 1;for (int i = 0; i < cnt.size(); i ++ )ans = ans * (i64)cnt[i] % mod;cout << ans % mod;
}

C - Maximum Median

原题链接

题意

给出一个数组和最大操作次数,每次操作可以任选一个元素加1,问经过操作后最大的中位数是多少

思路

这!题!卡!int!

我的思路就是首先对数组排序,之后就只用从中位数遍历后面的元素即可

观察数组发现,从中位数开始,如果当前遍历的数和比后面的数小,就可以只将当前的数加1(也能保证当前的数还是中位数),当前的数如果和后面的数一样大,就需要将后面一样大的数也一起加1(才能保证中位数也加了1)

定义的三个变量含义如下:
cnt:目前一次需要对几个数操作(才能让中位数加1)
ans:目前一共操作了多少次
idx:中位数在原基础上加了多少

遍历每个数时,中位数可以在原基础上加a[i] - a[i - 1]次,操作次数就需要加cnt * (a[i] - a[i - 1])次(因为每次可能要不止操作一个数),当ans大于最大操作次数时,跳出循环即可

代码

#include <bits/stdc++.h>using namespace std;using i64 = unsigned long long;int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int n, k;cin >> n >> k;vector<int> a(n);for (int i = 0; i < n; i ++ ) cin >> a[i];sort(a.begin(), a.end());i64 cnt = 0; // 现在一次动几个i64 ans = 0; // 目前操作多少次i64 idx = 0; // 中位数加了多少次for (int i = a.size() / 2 + 1; i < a.size(); i ++ ){cnt ++ ;idx += a[i] - a[i - 1];ans += cnt * (a[i] - a[i - 1]);if (ans > k){ans -= cnt * (a[i] - a[i - 1]);idx -= a[i] - a[i - 1];cnt -- ;break;}}cnt ++ ;cout << a[a.size() / 2] + idx + (k - ans) / cnt;
}

D - Remove Extra One

原题链接

题意

给出一个数组,如果某个元素之前的任何一个元素都比这个元素大,那就叫这个元素 record,现在要删去一个元素,让这个数组的 record 最多,问删去哪个元素

思路

赛时:八成是逆序对…看某一个元素和其他元素之间能够成多少逆序对…然后这样那样就能做了…/兴奋.jpg
赛后:
在这里插入图片描述
???被世界欺骗

本题属于思维题和逆序对毛线关系没有,遍历一遍数组就能得到答案

遍历数组时,记录下数组从开头到目前遍历位置的最大值次大值,再定义一个数组 x [ i ] x[i] x[i],存储删去元素 i i i 后,整个数组 record 数量的变化

每遍历一个元素——

  • 如果这个元素比记录下来的最大值还要大,说明这个元素就是 record,删去这个元素的话,整个数组的 record 数量会减 1,因此需要进行的操作是:x[i] --以及更新目前的最大值与次大值
  • 如果这个元素处于记录下来的最大值与次大值之间,说明这个元素是目前的次大值,只要删去目前的最大值,当前遍历的这个元素就会变成 record(也就会让整个数组的 record 数量加 1 ),因此需要进行的操作是:x[max] ++,以及更新目前的次大值‘’
  • 如果这个元素小于目前记录的次大值,无论删去哪一个元素都不会对数组的 record 数量有影响,就不用管它

最后,在 x [ N ] x[N] x[N]里找到最大的删去即可

代码

#include <bits/stdc++.h>using namespace std;const int N = 100010;int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int n;cin >> n;vector<int> a(n + 1), x(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i];int m1st = 0, m2nd = 0;for (int i = 1; i <= n; i ++ ){if (a[i] > m1st){x[a[i]] -- ;m2nd = m1st;m1st = a[i];}else if (a[i] > m2nd){x[m1st] ++ ;m2nd = a[i];}}int cnt = -0x3f3f3f3f, ans;for (int i = 1; i <= n; i ++ )if (x[i] > cnt){cnt = x[i];ans = i;}cout << ans;
}

E - A Determined Cleanup

原题链接

题意

已知 f ( x ) = q ( x ) ( x + k ) + p f(x)=q(x)(x+k)+p f(x)=q(x)(x+k)+p,求出合适的 q ( x ) q(x) q(x)使得多项式 f ( x ) f(x) f(x)中的每一项系数都大于等于0且小于给定的k,输出 f ( x ) f(x) f(x)系数

思路

f ( x ) f(x) f(x) 每一项为 a i x i a_ix^i aixi q ( x ) q(x) q(x) 每一项为 b i x i b_ix^i bixi,那么可以得到以下规律:
a 0 = b 0 k + p a_0=b_0k+p a0=b0k+p
a 1 = b 1 k + b 0 a_1=b_1k+b_0 a1=b1k+b0
a 2 = b 2 k + b 1 a_2=b_2k+b_1 a2=b2k+b1
……
a n = b n k + b n − 1 a_n=b_nk+b_{n-1} an=bnk+bn1

因为多项式的最高次数为 n,所以 b n b_n bn 必须为0,否组会让多项式的最高次数变成 n+1,
那么 a n = b n − 1 a_n=b_{n-1} an=bn1,所有的答案都在整数范围内取

现在关注第一个式子 a 0 = b 0 k + p a_0=b_0k+p a0=b0k+p a 0 a_0 a0又要小于 k k k,所以可以直接得到 a 0 = p % k a_0=p\%k a0=p%k,又因为 a 0 > = 0 a_0>=0 a0>=0,所以如果 p % k p\%k p%k 是负数的话,直接在它的基础上加 k 即可

同时,因为 0 < = a 0 < k 0<=a_0<k 0<=a0<k,把 a 0 a_0 a0 代入,得到 0 < = b 0 k + p < k 0<=b_0k+p<k 0<=b0k+p<k,化简可得 b 0 = − p k b_0=-\frac{p}{k} b0=kp,当然如果之前的 p % k p\%k p%k 是负数的话,也要将这里的 p 加1(正负平衡)

按照这个思路一直往下做,直到找到一个 b i = 0 b_i=0 bi=0 为止(在上面说了 b n = 0 b_n=0 bn=0, 所以找到一个等于0的 b 就可以默认找到答案了)

最后注意开 long long

代码

#include <bits/stdc++.h>using namespace std;using i64 = long long;int main()
{i64 p, k;cin >> p >> k;int cnt = 0;vector<i64> ans;while (p != 0){ans.push_back(p % k);p = -p / k;if (ans[cnt] < 0) ans[cnt] += k, p ++ ;cnt ++ ;}cout << cnt << '\n';for (int i = 0; i < cnt; i ++ ){cout << ans[i] << ' ';}
}

F - Minimal k-covering

原题链接

(网络流好难 勉强理解个大概但是搞不出这题……开摆!!!

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

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

相关文章

vue-baidu-map-3x 使用记录

在 Vue3 TypeScript 项目中&#xff0c;为了采用 标签组件 的方式&#xff0c;使用百度地图组件&#xff0c;冲浪发现了一个开源库 ovo&#xff0c;很方便&#xff01;喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本&#xff08;支持v2.0、v…

《面试1v1》ElasticSearch 和 Lucene

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

DLA 神经网络的极限训练方法:gradient checkpointing

gradient checkpointing 一般来说&#xff0c;训练的过程需要保存中间结果&#xff08;不管是GPU还是CPU&#xff09;。前向传播根据输入(bottom_data)计算输出(top_data)&#xff0c;后向传播由top_diff计算bottom_diff&#xff08;如果某个变量打开梯度进行训练的话&#xff…

5个顶级的开源有限元分析软件

每当我参加数值分析课程的教学时&#xff0c;都会回顾有限元方法的基础知识&#xff0c;很自然地就会出现使用哪种软件的问题。 以下讨论基于三个基本考虑&#xff1a; 在实际应用中&#xff0c;很少有人从头开始编写 FEM 代码。商业 FEM 软件通常在某些预定义的情况下非常易于…

Pandas操作Excel

Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析。 菜鸟教程&#xff1a;https://www.runoob.com/pandas/pandas-tutorial.html 读取Excel pd.read_excel(path,sheet_name,header) path&#xff1a;excel文件路径sheet_name&#xff1a;读取的sheet&#xff0…

3.netty和protobuf

1.ChannelGroup可以免遍历由netty提供,覆盖remove方法即可触发删除channel\ 2.群聊私聊 13.群聊私聊简单原理图 3.netty心跳检测机制,客户端对服务器有没有读写(读,写空闲) //IdleStateHandler(3,5,7,TimeUnite.SECONDS)是netty提供的检测状态的处理器,也加到pipeline,读,写,…

浅析 C 语言的共用体、枚举和位域

前言 最近在尝试阅读一些系统库的源码&#xff0c;但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅&#xff0c;发现是 C 语言中的共用体和位域。于是&#xff0c;趁着课本还没有扔掉&#xff0c;将一些相关的知识点记录在本文。 文章目录 前言共用体 (union)枚举…

网络开发-IO模型

基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 用户进程空间<-->内核空间内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络I/O和磁盘…

【编程】典型题目:寻找数组第K大数(四种方法对比)

【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09; 文章目录 【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09;1. 题目2. 题解2.1 方法一&#xff1a;全局排序&#xff08;粗暴&#xff09;2.2 方法二&#…

123.买卖股票的最佳时机3

目录 一、题目 二、分析代码 一、题目 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 二、分析代码 class Solution { public:int maxProfit(vector<int>& prices) {//0表示没有操作//1表示第1次买入&#xff0c;2表示第1次卖出//3表示第2…

用html+javascript打造公文一键排版系统11:改进单一附件说明排版

一、用htmljavascript打造公文一键排版系统10中的一个bug 在 用htmljavascript打造公文一键排版系统10&#xff1a;单一附件说明排版 中&#xff0c;我们对附件说明的排版函数是&#xff1a; function setAtttDescFmt(p) {var t p;var a ;if (-1 ! t.indexOf(:))//是半角冒…

学习源码,模仿编程

一.观察者模式: 1.创建事件 2.发布事件 3.监听事件 4.效果: 二.模板方法模式

FTP使用教程

FTP使用教程 目录 一&#xff0e;FTP简介二&#xff0e;FTP搭建三&#xff0e;FTP使用 一&#xff0e;FTP简介 FTP中文为文件传输协议&#xff0c;简称为文传协议。它也是一个应用程序&#xff0c;不同的操作系统有不同的FTP应用程序&#xff0c;这些应用程序都遵守同一种协议以…

LeetCode724. 寻找数组的中心下标

题干 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。…

k8s概念-pv和pvc

回到目录 kubernetes存储卷的分类太丰富了,每种类型都要写相应的接口与参数才行&#xff0c;这就让维护与管理难度加大。 persistenvolume(PV) 是配置好的一段存储(可以是任意类型的存储卷) 也就是说将网络存储共享出来,配置定义成PV。 PersistentVolumeClaim(PVC)是用户pod使…

谁更适合搭配甜点显卡?i7-13700KF、锐龙7 7800X3D对比:游戏相当 生产力Intel强了50%...

一、前言&#xff1a;如果搭配2000元甜点显卡 i7-13700KF和锐龙7 7800X3D谁更有性价比&#xff1f; 现在AMD最受欢迎的处理器无疑是拥有96MB三级缓存的锐龙7 7800X3D&#xff0c;这是一颗专为游戏而生的处理器。 Intel这边&#xff0c;i7-13700KF以略高于i5-13600K的售价&#…

小鱼深度产品测评之:阿里云容器服务器ASK,一款不需购买节点,即可直接部署容器应用。

容器服务器ASK测评 1、引言2、帮助文档3、集群3.1集群列表3.1.1 详情3.1.1.1概览 tab3.1.1.2基本信息 tab3.1.1.4集群资源 tab3.1.1.5 集群日志 tab3.1.1.6 集群任务 tab 3.1.2 应用管理3.1.2.1 详情3.1.2.2 详情3.1.2.3 伸缩3.1.2.4 监控 3.1.3 查看日志3.1.3.1 集群日志3.1.3…

Julia 日期和时间

Julia 通过 Dates 模块提供了以下三个函数来处理日期和时间&#xff1a; Date&#xff1a;表示日期&#xff0c;精确到日&#xff0c;只显示日期。DateTime&#xff1a;表示日期和时间&#xff0c;精确到毫秒。DateTime&#xff1a;表示日时间&#xff0c;精确到纳秒&#xff…

【Python】数据分析+数据挖掘——掌握Python和Pandas中的单元格替换操作

1. 前言 数据处理和清洗是数据分析和机器学习中至关重要的步骤。在数据处理过程中&#xff0c;我们经常需要对数据集进行清洗和转换&#xff0c;其中单元格替换是一个常用的技术。Python作为一种功能强大且灵活的编程语言&#xff0c;为数据处理提供了丰富的工具和库。Pandas库…

邀请媒体现场报道,有哪些作用?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体现场报道活动具有多种重要作用和意义&#xff0c;可以为你的活动带来广泛的曝光和正面影响。以下是一些邀请媒体现场报道的作用和意义&#xff1a; 1. 增加活动曝光度&#xff…