当前位置: 首页 > news >正文

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 - 帮帮神君先生

思路:考察最基本的二分算法。把题意抽象一下,就是对于每一个b_i,求在a数组中有多少个比b_i小的数,因为a数组和b数组都是2e5的大小,所以我们对于每一个b_i,每次去遍历一遍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 - 爱派克斯&#xff0c;启动! J - tmn学长的字符串2 K - 秋奕来买瓜 A - tmn学长的字符串1 思路&#x…...

sm4 加解密算法工具类( Java 版 )

sm4 加解密算法工具类&#xff08;java&#xff09; 说明&#xff1a;密钥是 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实现商户查询缓存&#xff1f;用Redis实现商户查询缓存的基本思路&#xff1f;使用Redis缓存的问题及解决方法&#xff1f;一、如何保持数据库数据和Redis缓存数据的一致性&#xff1f;1 内存淘汰机制2 超时剔除机制3 主动更新机制&#xff08;胜&#xff…...

重磅OpenAI发布ChatGPT企业版本

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

# Go学习-Day7

文章目录 断言文件打开/关闭文件读取文件写入文件 命令行参数解析Argsflag包 JSON 个人博客&#xff1a;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">选择方式&#xff1a;</view><u--form labelPosition"left" :mod…...

漏洞挖掘-利用

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

React钩子函数之useDeferredValue的基本使用

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

lodash常用方法

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

QByteArray与结构体之间相互转换

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

npm如何安装淘宝镜像

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

从项目中突显技能:在面试中讲述你的编程故事

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

python的观察者模式案例

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

C语言——类型转换

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

jmeter性能测试入门完整版

1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 本文为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 地址的原理和防范措施

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

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智能通信与网络国际学术会议&#xff08;ICN 2023&#xff09; 2023 International Conference on Intelligent Communication and Networking (ICN2023) 2023智能通信与网络国际学术会议&#xff08;ICN 2023&#xff09;将于2023年11月10-12日在中国常州召开。ICN 2023…...

Android投屏总结

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

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...