2024 蓝桥杯模拟赛3(div1+div2)
P8834 [传智杯 #3 决赛] 序列
简单的模拟,数据范围很小,暴力即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
void solve()
{
ll n,k,a[N],cnt=0;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++){
if(i<j&&a[i]*a[j]<=k) cnt++;
}
}
cout<<cnt;
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
P8780 [蓝桥杯 2022 省 B] 刷题统计
把一周作为一个周期,然后分类讨论总量除以周期量以后剩余的题数是小于五天的量,还是大于五天的量,也是简单的模拟
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve(){
long long n,m,t,k,ans,h;
cin>>n>>m>>t;
k=5*n+2*m;//一个周期的刷题量
h=t-(k*(t/k));//除完以后剩余的刷题量
if(h<=5*n) ans=7*(t/k)+ceil(1.0*h/n);
else if(h>5*n) ans=7*(t/k)+ceil(1.0*(h-5*n)/m)+5;
cout<<ans;
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
P8623 [蓝桥杯 2015 省 B] 移动距离
同样是一题简单的模拟题,最短距离就是两个点行和行的差值+列和列的值,蛇形排列注意推导一下奇数行和偶数行的点的列数即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int w,n,m,r1,c1,r2,c2,ans;//r为行数,c为列数
cin>>w>>n>>m;
r1=ceil(1.0*n/w);
r2=ceil(1.0*m/w);
if(r1%2==0){//偶数行的点的列数
c1=r1*w+1-n;
}
else c1=n-w*(r1-1);
if(r2%2==0){//奇数行的点的列数
c2=r2*w+1-m;
}
else c2=m-w*(r2-1);
cout<<abs(r1-r2)+abs(c1-c2);
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
P8738 [蓝桥杯 2020 国 C] 天干地支
我们从题目给的2020年为基准,重新打表一套新的天干地支,2020%10==0所以天干从geng开始,2020%12=4所以zi在第五个位置,学习更换基准的思想有些题目可以事半功倍
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string a[10] = { "geng","xin","ren","gui","jia","yi","bing","ding","wu","ji" };//天干
string b[12] = { "shen","you","xu","hai","zi","chou","yin","mao","chen","si","wu","wei" };
void solve()
{
int n;
cin>>n;
cout<<a[n%10]<<b[n%12];
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
P8635 [蓝桥杯 2016 省 AB] 四平方和
暴力枚举四层循环会超时,所以我们可以考虑枚举三个数,看第四个数是不是完全平方数,(int)sqrt(第四个数) 然后让这个平方看等不等于这第四个数,在枚举三个数的过程中我们假设i,j,k,i×i<n, i×i+j×j<n, i×i+j×j+k×k<n,这是每层循环的范围
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin>>n;
for(int i=0;i*i<n;i++)
{
for(int j=i;i*i+j*j<n;j++)
{
for(int k=j;i*i+j*j+k*k<n;k++)
{
int m=n-i*i-j*j-k*k;
int h=(int)sqrt(m);
if(h*h==m){
cout<<i<<" "<<j<<" "<<k<<" "<<h;
return ;
}
}
}
}
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
P8697 [蓝桥杯 2019 国 C] 最长子序列
从要查找的第一个字母开始去遍历母字符串,找到后用pos更新起点,然后看是否可以找完,如果一个字母已经让这个位置更新到了末尾就没有结果
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
string s1,s2;
int cnt=0;
int pos=0;
cin>>s1;
cin>>s2;
for(int i=0;i<s2.size();i++)
{
for(int j=pos;j<s1.size();j++)
{
if(s2[i]==s1[j]){
pos=j+1;
cnt++;
break;//找到就跳出 找下一个
}
if(j==s1.size()-1){//这个字母找不到勒
cout<<cnt;
return;
}
}
}
cout<<cnt;
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
P8654 [蓝桥杯 2017 国 C] 合根植物
这是一题并查集的模板题,学习一下并查集的基础就会了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int p[N];
int find(int x)//朴素并查集模板
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
void solve()
{
int n,k,a,b,m,ans;
cin>>n>>k;
for(int i=1;i<=n*k;i++) p[i]=i;//初始化并查集
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
p[find(a)]=find(b);//合并a,b所在的两个集合
}
for(int i=1;i<=n*k;i++){
if(i==p[i]) ans++;//看有几个集合
}
cout<<ans;
}
int main()
{
solve();
}