HUT23级训练赛
目录
A - tmn学长的字符串1
B - 帮帮神君先生
C - z学长的猫
D - 这题用来防ak
E - 这题考察FFT卷积
F - 这题考察二进制
G - 这题考察高精度
H - 这题考察签到
I - 爱派克斯,启动!
J - tmn学长的字符串2
K - 秋奕来买瓜
A - tmn学长的字符串1
思路:字符串模拟。
对于第一类字符串,其组成一定是合法的数字,第二类字符串则是其他剩余的情况。
对于字符串的处理:我们开一个string去记录每段字符串,对于一段字符串的记录:因为会出现空串的情况,所以我们在记录字符串时,加入一个特殊符号,在最后输出的时候特判即可。
因为是字符串模拟,所以不涉及算法,具体思路看代码注释:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
const int maxv = 4e6 + 5;
typedef pair<ll, ll> pll;bool check(string s)//判断是否为数字字符串
{for(int i=0;i<s.size();i++){if(s[0]=='0'&&s.size()!=1){return false;}if(s[i]<'0'||s[i]>'9') return false;}return true;
}void solve()
{string s;cin>>s;s+=";";vector<string> c1,c2;//使用vector去储存每个字符串string t;for(int i=0;i<s.size();i++){if(s[i]==','||s[i]==';'){//我们把题目给定的','和';'称为终止符,当我们遇见终止符时,就进行判断if(t.empty()) t.push_back('#');//如果当前用于储存的字符串t为空,那么我们就放入一个特殊字符,特殊字符只是用于应对空串的情况,其他情况不会出现特殊字符if(check(t)){//去检验目前字符串是否合法c1.push_back(t);//合法,即全为数字,那么存入1}else{c2.push_back(t);//否则存入2}t="";//将t清空}else t+=s[i];//如果当前不是终止符,直接将该字符加入t即可}if(c1.size()){//因为c1是储存的数字,所以不可能出现空串的情况cout<<"\"";for(int i=0;i<c1.size();i++){cout<<c1[i];if(i!=c1.size()-1) cout<<",";}cout<<"\"";}else{cout<<"-";}cout<<endl;if(c2.size()){//c2储存的其他情况的字符串,所以需要进行特判cout<<"\"";if(c2[0]!="#") cout<<c2[0];//特判特殊字符for(int i=1;i<c2.size();i++){cout<<",";if(c2[i]!="#") cout<<c2[i];}cout<<"\"";}else{cout<<"-";}cout<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;//cin >> t;while (t--){solve();}system("pause");return 0;
}
B - 帮帮神君先生
思路:考察最基本的二分算法。把题意抽象一下,就是对于每一个,求在a数组中有多少个比
小的数,因为a数组和b数组都是2e5的大小,所以我们对于每一个
,每次去遍历一遍a数组,会超时,因为这时候我们的时间复杂度相当于是2e5*2e5,而c一秒只能跑1e8左右,所以需要算法对其进行优化。运用二分算法即可成功解决此题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
const int maxv = 4e6 + 5;
typedef pair<ll, ll> pll;void solve()
{int n,m;cin>>n>>m;vector<int> a(n),b(m);for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<m;i++) cin>>b[i];sort(a.begin(),a.end());for(int i=0;i<m;i++){int t=upper_bound(a.begin(),a.end(),b[i])-a.begin()-1;if(t>=0){cout<<t+1<<" ";}else cout<<0<<" ";}cout<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;//cin >> t;while (t--){solve();}system("pause");return 0;
}
C - z学长的猫
思路:题目要我们先删除,但先排序后删除本质上是一样的,所以先将数组进行排序,由此,此题转化为了在有序数组中寻找最大的一段符合条件的的区间,即区间中后一个数减前一个的差不能超过k,因为题目要求剩余区间全部合法,所以我们只用求出最大合法区间,然后把其他的全部删去就好。
#include<bits/stdc++.h>using namespace std;
const int N=1e5+5;
typedef long long ll;
typedef pair<ll,ll> pll;void solve()
{ int n,k;cin>>n>>k;vector<int> a(n+5);for(int i=1;i<=n;i++) cin>>a[i];sort(a.begin()+1,a.begin()+1+n);int cnt=1;int res=0;for(int i=1;i<n;i++){int x=a[i+1]-a[i];if(x<=k){cnt++;}else{res=max(res,cnt);cnt=1;}}res=max(res,cnt);cout<<n-res<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}
D - 这题用来防ak
思路:签到题,,判断最大的两个数相加是否大于等于10即可。
#include<bits/stdc++.h>using namespace std;
const int N=1e5+5;
typedef long long ll;
typedef pair<ll,ll> pll;void solve()
{ int a,b,c;cin>>a>>b>>c;vector<int> s;s.push_back(a),s.push_back(b),s.push_back(c);sort(s.begin(),s.end());if(s[2]+s[1]>=10) cout<<"YES"<<endl;else cout<<"NO"<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}
E - 这题考察FFT卷积
思路:将题意抽象为:给定一个n,要求输出1-n范围内,只含有一个非0数字的个数。
我们从规律入手,我们可以发现1-9的范围内,有9个数(1-9本身),10-90的范围内有9个数 (10,20,30……90)以此类推,100到900之间也存在9个数,我们可以发现,9的个数,是和n的位数挂钩的,并且最高位为多少,就会多加几个数字。因此我们可以将n的位数求出来,并且求出n的最高位,就可以得到答案。
其实我们发现,如果是两位数的话,最后的数字为从9开始加,所以位数减一就为9的组数,比如3位数就有2组9,也就是18。此时刚好分解得到最高位,再加上最高位就可以了。
#include<iostream>
#include<algorithm>typedef long long ll;
const int N=1e5+5;
using namespace std;int main()
{ int t;scanf("%d",&t);while (t--){ int n;cin>>n;int cnt=0;if(n<=9){cout<<n<<endl;continue;}while(n>10){n/=10;cnt++;}cout<<n+cnt*9<<endl;} return 0;}
F - 这题考察二进制
思路:签到题,按题意模拟即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
typedef pair<ll,int> pll;void solve()
{int n;cin>>n;vector<int> a(n);for(int i=0;i<n;i++) cin>>a[i];int cnt=0;for(int i=0;i<n;i++){int res=0;if(a[i]==0){for(int j=i;j<n;j++){if(a[j]==0){res++;}else break;}cnt=max(cnt,res);}}cout<<cnt<<endl;}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}
G - 这题考察高精度
思路:签到,诈骗题,其实根本用不上高精度,我们求前n项和,然后减去所有2的幂次方的两倍即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll ;
const int maxv=4e6+5;
typedef pair<ll,ll> pll;void solve()
{ll n;cin>>n;ll res=(n+1)*n/2;for(int i=0;;i++){ll x=1ll<<i;//求2的幂次方,使用其他方法也可以,比如循环或者直接调用pow函数if(x<=n) res-=x*2;else break;}cout<<res<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();}system("pause");return 0;
}
H - 这题考察签到
思路:二分答案,防ak题
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
typedef long long ll;
const int maxv = 4e6 + 5;
typedef pair<ll, ll> pll;
typedef array<ll,3> p3;ll n,m,k,s;
vector<int> a(N),b(N);
vector<pll> am(N),bm(N);
vector<pll> w(N);bool check(int x)
{ll res=0;vector<ll> v;for(int i=0;i<m;i++){auto [t,c]=w[i];if(t==1){v.push_back(am[x].first*c);}else{v.push_back(bm[x].first*c);}}sort(v.begin(),v.end());for(int i=0;i<k;i++) res+=v[i];return res<=s;}void solve()
{cin>>n>>m>>k>>s;int c=2e9;int day=1;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]<c){c=a[i];day=i;}am[i]={c,day};}c=2e9,day=1;for(int i=1;i<=n;i++){cin>>b[i];if(b[i]<c){c=b[i];day=i;}bm[i]={c,day};}for(int i=0;i<m;i++){int t,c;cin>>t>>c;w[i]={t,c};}int l=1,r=n;int ans=-1;while(l<=r){int mid=(l+r)/2;if(check(mid)){ans=mid;r=mid-1;}else{l=mid+1;}}if(ans==-1){cout<<-1<<endl;return ;}cout<<ans<<endl;vector<p3> v;for(int i=0;i<m;i++){auto [t,c]=w[i];if(t==1){v.push_back({am[ans].first*c,am[ans].second,i+1});}else v.push_back({bm[ans].first*c,bm[ans].second,i+1});}sort(v.begin(),v.end(),[](p3 x,p3 y){if(x[0]==y[0]) return x[1]<y[1];return x[0]<y[0];});vector<pll> cur;int cnt=1;for(int i=0;i<k;i++){auto [x,y,id]=v[i];cur.push_back({id,y});cnt++;}for(auto [x,y]: cur) cout<<x<<" "<<y<<"\n";}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;//cin >> t;while (t--){solve();}system("pause");return 0;
}
I - 爱派克斯,启动!
思路:签到。
统计每组的和是否大于等于2即可。
#include<bits/stdc++.h>using namespace std;
const int N=1e5+5;
typedef long long ll;void solve()
{ int cnt=0;int n;cin>>n;for(int i=0;i<n;i++){int a,b,c;cin>>a>>b>>c;if(a+b+c>=2) cnt++;}cout<<cnt<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;//cin>>t;while(t--){solve();}system("pause");return 0;
}
J - tmn学长的字符串2
思路:字符串模拟。
将题意抽象一下:给定一个字符串,将指定区域的字符串循环移动k次。
因为k的范围位1e9,所以不可能去一次次的进行暴力移动, 我们可以发现,当一个子串的循环移动次数为该串的长度时,子串复原,所以我们只需要去对子串进行k%len(子串长度)次的移动即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll ;
const int maxv=4e6+5;
typedef pair<ll,ll> pll;void solve()
{string s;cin>>s;int q;cin>>q;while(q--){int l,r,k;cin>>l>>r>>k;int len=r-l+1;k%=len;string a=s.substr(0,l-1);string b=s.substr(l-1,r-l+1);string c=s.substr(r);string x=b.substr(0,len-k);string y=b.substr(len-k);s=a+y+x+c;}cout<<s<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;//cin>>t;while(t--){solve();}system("pause");return 0;
}
给出第二种题解:
模拟操作,把区间内的每个字母向右移动k位即可
假设区间为[1, 5],区间内字符串为12345
向右移动2位的话就是45123,
向右移动5位的话还是12345,相当于没变 ,
所以向右移动7位和向右移动2位的效果是一致的
所以每次操作时先把k模一下区间长度即可
#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 = 110;int main()
{IOSstring s;cin >> s;int Q;cin >> Q;while(Q --){int l, r, k;cin >> l >> r >> k;string tmp = s;for(int i = l; i <= r; i ++){//ne表示移动后在字符串中所处的下标, i - l 表示在所选区间内的第几位 int ne = l - 1 + (i - l + k) % (r - l + 1);//(r - l + 1)是区间长度,(i - l + k) % (r - l + 1)是移动后所处在区间中第几个位置(从0开始算) tmp[ne] = s[i - 1];}s = tmp;}cout << s << endl;return 0;
}
K - 秋奕来买瓜
思路:签到,判断奇偶即可,注意特判2的情况。
#include<iostream>
using namespace std;
typedef long long ll;int main()
{int n;cin>>n;if(n%2!=0||n==2){cout<<"NO"<<endl;}else{cout<<"YES"<<endl;}return 0;
}
相关文章:
HUT23级训练赛
目录 A - tmn学长的字符串1 B - 帮帮神君先生 C - z学长的猫 D - 这题用来防ak E - 这题考察FFT卷积 F - 这题考察二进制 G - 这题考察高精度 H - 这题考察签到 I - 爱派克斯,启动! J - tmn学长的字符串2 K - 秋奕来买瓜 A - tmn学长的字符串1 思路&#x…...

sm4 加解密算法工具类( Java 版 )
sm4 加解密算法工具类(java) 说明:密钥是 hexString import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec;import cn.hutool.core.codec.Base64Decoder; import…...

Redis项目实战——商户查询缓存
目录 为什么要用Redis实现商户查询缓存?用Redis实现商户查询缓存的基本思路?使用Redis缓存的问题及解决方法?一、如何保持数据库数据和Redis缓存数据的一致性?1 内存淘汰机制2 超时剔除机制3 主动更新机制(胜ÿ…...

重磅OpenAI发布ChatGPT企业版本
8月29日凌晨,Open AI官网发布ChatGPT企业版本! 企业版简介: ChatGPT企业版提供企业级安全和隐私、无限的高速 GPT-4 访问、用于处理更长输入的更长上下文窗口、高级数据分析功能、自定义选项等等。人工智能可以协助和提升我们工作生活的各个…...

# Go学习-Day7
文章目录 断言文件打开/关闭文件读取文件写入文件 命令行参数解析Argsflag包 JSON 个人博客:CSDN博客 断言 type Node struct {x inty int }func main() {var a interface{}var n Node Node{1, 2}a nvar b Nodeb a.(Node)fmt.Println(b) }此处我们有一个结构体…...

uniapp-form表单
<template><view class"ptb-20 plr-30 bg min100"><view class"bg-white radius-20 pd-30"><view class"bold mt-30 mb-50 size-32">选择方式:</view><u--form labelPosition"left" :mod…...

漏洞挖掘-利用
一、文章简介 整合一些web漏洞,以及对漏洞的理解。 二、Web漏洞 1.SQL注入 (1)定义 开发者程序编写过程中,对传入用户数据过滤不严格,将可能存在的攻击载荷拼接到SQL查询语句当中,再将这些查询语句传递到…...

React钩子函数之useDeferredValue的基本使用
在React中,使用钩子函数可以方便地管理组件的状态和副作用。useDeferredValue是React 18中新引入的钩子函数之一,它可以帮助我们优化渲染性能,让组件更加流畅。 useDeferredValue的作用是将一个值延迟更新。这个值可以是状态、属性或其他变量…...

lodash常用方法
cloneDeep 克隆 import { cloneDeep,reduce } from lodash; const b {c:1} const a cloneDeep(b)debounce 防抖 import { debounce } from lodash; debounce(() > {}, 300, { trailing: true })()omit方法删除指定属性,返回一个新的对象 import …...

QByteArray与结构体之间相互转换
Qt项目会碰到自定义结构体和字符数组之间的转换问题,不妨假设结构体名字为custom_struct, 字符数组名字为array_data QByteArray转换为自定义结构体 custom_struct *struct_data reinterpret_cast<custom_struct *>(array_data.data());自定义结构体转换为…...

npm如何安装淘宝镜像
通过命令配置 这种方法是通过修改npm的全局配置文件,将默认的镜像源改为淘宝镜像。具体步骤如下: 打开终端,输入以下命令,设置淘宝镜像源:(windowr) npm config set registry https://registr…...

从项目中突显技能:在面试中讲述你的编程故事
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

python的观察者模式案例
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言二、具体代码写在结尾 前言 最近写安卓的代码比较多,了解了java代码的注册回调机制,也就是观察者模式,搜索了一下python也有…...

C语言——类型转换
数据有不同的类型,不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成强制类型转换:把表达式的运算结果强制转换成所需的数据类型 语法格…...

jmeter性能测试入门完整版
1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 本文为JMeter性能测试完整入门篇&…...

报错sql_mode=only_full_group_by
首发博客地址 https://blog.zysicyj.top/ 报错内容 ### The error may exist in file[D:\code\cppCode20221025\leader-system\target\classes\mapper\system\TJsonDataMapper.xml] ### The error may involve defaultParameterMap ### The error occurred while…...

伪造 IP 地址的原理和防范措施
在数字化时代,网络安全是至关重要的话题。其中,伪造 IP 地址是一种可能导致网络攻击和欺诈的技术手段。这里将深入探讨伪造 IP 地址的原理以及如何采取措施来防范这种风险。 一.伪造 IP 地址的原理 伪造 IP 地址是一种操纵网络通信的方式,它…...

Linux通过libudev获取挂载路径、监控U盘热拔插事件、U盘文件系统类型
文章目录 获取挂载路径监控U盘热拔插事件libusb 文件系统类型通过挂载点获取挂载路径添libudev加库 获取挂载路径 #include <stdio.h> #include <libudev.h> #include <string.h>int main() {struct udev *udev;struct udev_enumerate *enumerate;struct ud…...

【会议征稿】2023智能通信与网络国际学术会议(ICN 2023)
2023智能通信与网络国际学术会议(ICN 2023) 2023 International Conference on Intelligent Communication and Networking (ICN2023) 2023智能通信与网络国际学术会议(ICN 2023)将于2023年11月10-12日在中国常州召开。ICN 2023…...

Android投屏总结
#android手机投屏 ####导语 至于手机投屏的实现方法可谓五花八门,今天小袁就说下以开发人员的角度来说下当今手机的主流投屏方法。目前这种将终端信号经由WiFi传输到电视、电视盒的技术有三种:DLNA、AirPlay、Miracast、Google Cast。 ##手机投屏智能电…...

vue2 组件组成部分,组件通信,进阶语法
一、学习目标 1.组件的三大组成部分(结构/样式/逻辑) scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法父传子子传父非父子通信(扩展) 4.进阶语法 v-model原理v-model应用于组件sync修饰符ref和$refs$nextTic…...

信看课堂笔记—LDO和DC-DC电路打PK
LDO(low dropout voltage regulator,低压差线性稳压器)和DC-DC(Direct current-Direct current converter,直流电压转直流电压转换器)电源是非常常见的电源电路,LDO 出来的比较早,像老戏骨一样,…...

C++ Day6
目录 一、菱形继承 1.1 概念 1.2 格式 二、虚继承 2.1 作用 2.2 格式 2.3注意 三、多态 3.1函数重写 3.2 虚函数 3.3 赋值兼容规则 3.4 多态中,函数重写的原理 3.5 虚析构函数 3.5.1 格式 3.6 纯虚函数 3.6.1格式 四、抽象类 五、模板 5.1模板的特…...

分布式系统与微服务的区别是什么?
分布式系统和微服务是两个相关但不同的概念,它们都是在构建复杂的软件应用时使用的架构思想。 分布式系统: 分布式系统是指由多个独立的计算机或服务器通过网络连接共同工作,协同完成一个任务或提供一个服务。在分布式系统中,各个…...

python:用python构建一个物联网平台
要使用Python构建物联网平台,您需要考虑以下步骤: 确定平台的基本要求和功能 首先,您需要明确您将要构建的平台的功能和特点。例如,您可能需要支持多种设备,并使用各种传感器来收集数据。您可能需要实现实时数据可视化…...

基于Qt5开发图形界面——WiringPi调用Linux单板电脑IO
Qt5——WiringPi Qt5WiringPi示例教程 Qt5 Qt是一种跨平台的应用程序开发框架。它被广泛应用于图形用户界面(GUI)开发,可以用于构建桌面应用程序、移动应用程序和嵌入式应用程序。Qt提供了丰富的功能和工具,使开发人员可以快速、高…...

【MySQL】组合查询
目录 一、组合查询 1.创建组合查询 2.union规则 3.包含或取消重复的行 4.对组合查询结果排序 一、组合查询 多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查…...

ChatGPT:引领人机交互的未来
前言 在信息技术飞速发展的时代,人机交互的方式也在不断演进。技术对人们生活和工作的影响。本文将带您深入探讨一款引领人机交互未来的人工智能模型——ChatGPT。 ChatGPT简介 ChatGPT 是一种由开放AI(OpenAI)开发的人工智能模型…...

【算法】经典的八大排序算法
点击链接 可视化排序 动态演示各个排序算法来加深理解,大致如下 一,冒泡排序(Bubble Sort) 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次比较和交换相邻元素的方式,将…...

防溺水预警识别系统算法
防溺水预警识别系统旨在通过opencvpython网络模型深度学习算法,防溺水预警识别系统算法实时监测河道环境,对学生等违规下水游泳等危险行为进行预警和提醒。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行࿰…...