2024 蓝桥杯模拟赛3(div1+div2)

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 find(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();
}

P8692 [蓝桥杯 2019 国 C] 数正方形
进行如图的推断得出规律

题解代码,注意取余那一步

点击查看代码
#include <bits/stdc++.h>
#define int long long
const int mod=1e9+7;
using namespace std;
void solve()
{
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=n-1;i++) {
        sum+=(n-i)*(n-i)*i;
		sum%=mod;};//这一步不能写出sum+=(n-i)^2%mod; 
	cout<<sum;
}

signed main()
{
	solve();
}
点击查看代码

posted on 2024-03-01 16:52  swj2529411658  阅读(69)  评论(0)    收藏  举报

导航