2025牛客寒假算法基础集训营2 个人题解

news/2025/1/26 18:41:19/文章来源:https://www.cnblogs.com/personaowl/p/18690886

2025牛客寒假算法基础集训营2 个人题解

A.一起奏响历史之音!

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve(){bool flag=false;for(int i=1;i<=7;i++){int x;cin>>x;if(x!=1 && x!=2 && x!=3 && x!=5 && x!=6){flag=true;}}if(flag) cout<<"NO"<<endl;else cout<<"YES"<<endl;}
int main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;while(T--) solve();return 0;
}

B.能去你家蹭口饭吃吗

解题思路

  • 发现答案就是中位数
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=5e5+10;
int a[N];
void solve(){int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1);int ans=n/2+1;cout<<a[ans]-1<<endl;
}
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;while(T--) solve();return 0;
}

F.一起找神秘的数!

解题思路

  • 题目要求x+y = x&y + x|y + x^y,容易发现当某一二进制位相同,即同时为0或者同时为1时满足要求,则答案为区间长度
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
void solve(){int l,r;cin>>l>>r;int ans=r-l+1;cout<<ans<<endl;}
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

G. 一起铸最好的剑!

解题思路

  • 一开始卡了很久,以为是精度问题,写了python都没过
  • 观察题目范围,n最大为1e9,容易知道答案次数不会很大,直接枚举即可
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define double long double
using namespace std;
void solve(){int n,m;cin>>n>>m;if(m==1){cout<<1<<endl;return;}int k=0;for(int i=1;i<=100;i++){int t=powl(m,i);if(t>=n){k=i;break;}}if(k==1){cout<<1<<endl;return;}
//	cout<<" "<<k<<endl;int t1=powl(m,k-1);int t2=powl(m,k);int ans=0;if(llabs(t1-n)<=llabs(t2-n)){ans=k-1;}else ans=k;cout<<ans<<endl;
}
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

J. 数据时间?

解题思路

  • 大模拟,可以通过substr函数得到时间,判断时间可以通过都转化为秒数进行比较,这样便于写代码
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int t1st,t1ed,_t1st,_t1ed;
int t2st,t2ed;
int t3st,t3ed,_t3st,_t3ed;
int calc(int h,int m,int s){return 3600*h+60*m+s;
}
bool check1(int T){if(t1st<=T && T<=t1ed) return true;if(_t1st<=T && T<=_t1ed) return true;return false;
}
bool check2(int T){if(t2st<=T && T<=t2ed) return true;return false;
}
bool check3(int T){if(t3st<=T && T<=t3ed) return true;if(_t3st<=T && T<=_t3ed) return true;return false;
}
void solve(){t1st=calc(7,0,0),t1ed=calc(9,0,0);_t1st=calc(18,0,0),_t1ed=calc(20,0,0);t2st=calc(11,0,0),t2ed=calc(13,0,0);t3st=calc(22,0,0),t3ed=calc(23,59,59);_t3st=calc(0,0,0),_t3ed=calc(1,0,0);int n,Y,M;cin>>n>>Y>>M;set<string> st1,st2,st3;for(int i=1;i<=n;i++){string s1,s2,s3;cin>>s1>>s2>>s3;int y=stoi(s2.substr(0,4));int m=stoi(s2.substr(5,2));if(m!=M || y!=Y) continue;int _hour=stoi(s3.substr(0,2));int _minn=stoi(s3.substr(3,2));int _second=stoi(s3.substr(6,2));int _time=calc(_hour,_minn,_second);if(check1(_time)){st1.insert(s1);}if(check2(_time)){st2.insert(s1);}if(check3(_time)){st3.insert(s1);}}cout<<st1.size()<<" "<<st2.size()<<" "<<st3.size()<<endl;}
int main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;while(T--) solve();return 0;
}

K.可以分开吗?

解题思路

  • dfs,每次搜索一个联通块时,要注意将周围都白色方块计数,并且打上标记,标记的方法可以用map或者set记录,亲测重新再开一个vis数组每次清空会超时
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=510;
typedef pair<int,int> PII;
char g[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
bool vis[N][N];
bool vis2[N][N];
int n,m;
int ans=1e8;
int cnt=0;
void dfs(int x,int y,map<PII,int> &mp){vis[x][y]=1;for(int i=0;i<4;i++){int tx=x+dx[i];int ty=y+dy[i];if(tx<1 || tx>n || ty<1 || ty>m) continue;if(g[tx][ty]=='0'){if(!mp[{tx,ty}]){cnt++;mp[{tx,ty}]=1;}continue;}if(vis[tx][ty]) continue;dfs(tx,ty,mp);}
}
void init(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){vis2[i][j]=0;}}
}
void solve(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>g[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(g[i][j]=='1' && !vis[i][j]){map<PII,int> mp;cnt=0;dfs(i,j,mp);ans=min(ans,cnt);}}}cout<<ans<<endl;
}
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;while(T--) solve();return 0;
}

D. 字符串里串

解题思路

  • 找一个连续子串,和一个子序列,满足要求,贪心的想,从左往右看,若第i位字母在[i+1,n]中出现,则可以将[1,i]子串是满足条件的(我们可以将[1,i-1]作为一部分,后面出现的相同的字母作为第二部分,构成子序列),从右向左同理。
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve(){int n;cin>>n;string s;cin>>s;s=" "+s;map<char,int> mp;int ans=0;for(int i=n;i>=2;i--){if(mp[s[i]]) ans=max(ans,i);else mp[s[i]]=1;}map<char,int> mpp;for(int i=1;i<=n-1;i++){if(mpp[s[i]]) ans=max(ans,n-i+1);else mpp[s[i]]=1;}cout<<ans<<endl;
}
int main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;while(T--) solve();return 0;
}

C. 字符串外串

解题思路

  • 构造题,与D的想法类似,首先构造m部分,在字符串右边循环插入a-z,此时左端部分只能插入a-z这26种字母,因此无解条件为n-m>26 || n==m
  • 因此统一构造方法,取(n-m)个字母节的循环,详细可以见官方题解的图
  • image-20250125131018056
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve(){int n,m;cin>>n>>m;if(n==m || n-m>26){cout<<"NO"<<endl;return;}string s;cout<<"YES"<<endl;for(int i=0;i<n;i++){char ch='a'+i%(n-m);s+=ch;}cout<<s<<endl;}
int main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

H.一起画很大的圆!

解题思路

  • guess题,猜错了,鏖战两小时未能战胜
  • 外接圆半径最大,想到尽量让三个点接近一条直线,这样的话半径最大,则可以有两种方法构造,(b,d),(b-1,d),(a,d-1)或(a,d),(a,d-1),(a+1,c)比较一下即可
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define double long double
using namespace std;
typedef pair<int,int> PII;double distance(double x1,double y1,double x2,double y2){double dx=x2-x1;double dy=y2-y1;return sqrt(dx*dx+dy*dy);
}
double radius(double x1, double y1,double x2, double y2,double x3, double y3)
{double a=distance(x1,y1,x2,y2);double b=distance(x2,y2,x3,y3);double c=distance(x3,y3,x1,y1);double s=abs(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2;double r=(a*b*c)/(4.0*s);return r;
}void solve(){int a,b,c,d;cin>>a>>b>>c>>d;PII ans[4];int x1,y1,x2,y2,x3,y3;double maxn=0;double r=0;x1=b,y1=d;x2=b-1,y2=d;x3=a,y3=d-1;r=radius(x1,y1,x2,y2,x3,y3);if(r>maxn){maxn=r;ans[1]={x1,y1};ans[2]={x2,y2};ans[3]={x3,y3};}x1=a,y1=d;x2=a,y2=d-1;x3=a+1,y3=c;r=radius(x1,y1,x2,y2,x3,y3);if(r>maxn){maxn=r;ans[1]={x1,y1};ans[2]={x2,y2};ans[3]={x3,y3};}for(int i=1;i<=3;i++){cout<<ans[i].first<<" "<<ans[i].second<<endl;}
}
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

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

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

相关文章

亚像素视觉使用与故障处理

亚像素视觉使用与故障处理 V1.0 2024.05修订日期修订内容2024/5/20初版(V1.0)目录1. 界面介绍 41.1运行画面 41.2设定画面 42.操作方法 52.1设定与运行模式切换 52.2 手动拍照测试、执行条件选择 52.3常用工具使用与工具…

计量经济学——计量分析步骤(零)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 计量经济学作为现代经济学的重要分支。经济计量分析是现代经济学研究中不可或缺的一部分,旨在运用数学、统计学和计算机科学的方法,对经济现象进行量化研究…

一起看很美的日落!

一起看很美的日落! 题目描述 牛可乐有一棵由 $n$ 个结点构成的树,第 $i$ 个节点的权值为 $a_i$。 我们定义一个连通块 $\mathbb{V}$ 的权值为:当前连通块中两两结点的权值异或和,即 $\sum\limits_{i,j \in \mathbb{V}}{a_i \oplus a_j}$;你需要计算全部连通块的权值之和。…

哈工深准备复试~代码复健

去年年前过完了c语言基础,初始算了下分成绩还不错,现在寒假在家准备复试 东西真的忘得干干净净了,因为是跨考,所以算是零基础吧,每天刷刷代码题,就当复健了

Avalonia系列文章之再试牛刀

通过前一篇文章,已经了解了AvaloniaUI的环境安装以及项目创建,磨刀不误砍柴工,今天继续进行Avalonia基础知识学习,如有不足之处,还请指正。通过前一篇文章,已经了解了AvaloniaUI的环境安装以及项目创建,磨刀不误砍柴工,今天继续进行Avalonia基础知识学习,如有不足之处…

2025.1.25

本次错误分析: 本次错误主要集中于:对于题目读题不认真,做题不细心,题目中明显要求了举例说明,但是本题给的答案却没有明显的给出例子,导致本题扣分 日后改正:应该多多端正自己的态度,做到对待任何题目犹如对待考场上的题目一样认真

思通数科舆情系统的预警设置

思通数科舆情系统中的预警设置功能在现代企业和政府的舆情管理中具有重要的市场应用和战略意义。通过精准的预警机制,思通数科舆情系统能够实时监控舆情动向,提前识别潜在的风险,帮助企业与政府机构及时做出反应,最大限度地降低负面影响。1、什么是预警 网络预警是指从危机…

第十二章 质量管理(2025年详细解析版)

目录导语什么是质量管理?关注两个方面:12.1 管理基础什么是质量?质量与等级质量等级预防胜于检查预防胜于检查质量管理质量方针质量目标质量管理水平有效性递增质量管理体系GB/T 19000系列标准全面质量管理项目质量管理新实践12.2 项目质量管理过程过程概述项目质量管理过…

STM32 GPIO使用

1.GPIO是什么 GPIO(General Purpose Input/Output)通用输入输出,是STM32开发板中的通用输入输出接口,用于连接外部设备。 GPIO 有时候简称为“IO口”。通用,说明它是常见的。 输入输出,就是说既能当输入口使用,又能当输出口使用。 端口,就是元器件上的一个引脚。输入模式…