【蓝桥杯】国赛普及-

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<bits/stdc++.h>
using ll=unsigned long long;
#define int ll
const int N=2e5+10;
int k=0;
std::string s;
int a,b,c,d;
void solve()
{
	char op;
	std::cin>>op;
	if(op=='A')
	{
		std::string s;
		for(int i=1;i<=2023;i++)
		{
			s+=std::to_string(i);	
		}	
		//std::cout<<s;
		//std::cout<<5484660609<<'\n';
		ll ans=0;
		int len=s.length();
		
		std::vector<int> v1;
		std::vector<int> v2;
		std::vector<int> v3;
		for(int i=0;i<len;i++)
		{
			if(s[i]=='2') v1.push_back(i);
			if(s[i]=='0') v2.push_back(i);
			if(s[i]=='3') v3.push_back(i);
		}
		
		for(int i=0;i<v1.size();i++)
		{
			for(int j=0;j<v2.size();j++)
			{
				if(v2[j]<=v1[i]) continue;
				
				for(int k=i+1;k<=v1.size();k++)
				{
					if(v1[k]<=v2[j]) continue;
					
					for(int p=0;p<v3.size();p++)
					{
						if(v3[p]<=v1[k]) continue;
						ans++;
					}
				}
			}
		}
		std::cout<<ans<<'\n';
	}
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

答案算出来是5484660609。

把质数存下来枚举判断即可,我不记得筛质数的板子所以写了个isprime。。

#include<bits/stdc++.h>
using ll=unsigned long long;
#define int ll
const int N=2e5+10;
int k=0;
std::string s;
int a,b,c,d;
bool isprime(int x)
{
	for(int i=2;i<=x/i;i++)
	{
		if(x%i==0) return false;
	}
	return true;
}
void solve()
{
	char op;
	std::cin>>op;
	if(op=='A')
	{
		std::string s;
		for(int i=1;i<=2023;i++)
		{
			s+=std::to_string(i);	
		}	
		//std::cout<<s;
		std::cout<<5484660609<<'\n';
		ll ans=0;
		int len=s.length();
		
		std::vector<int> v1;
		std::vector<int> v2;
		std::vector<int> v3;
		for(int i=0;i<len;i++)
		{
			if(s[i]=='2') v1.push_back(i);
			if(s[i]=='0') v2.push_back(i);
			if(s[i]=='3') v3.push_back(i);
		}
		
		for(int i=0;i<v1.size();i++)
		{
			for(int j=0;j<v2.size();j++)
			{
				if(v2[j]<=v1[i]) continue;
				
				for(int k=i+1;k<=v1.size();k++)
				{
					if(v1[k]<=v2[j]) continue;
					
					for(int p=0;p<v3.size();p++)
					{
						if(v3[p]<=v1[k]) continue;
						ans++;
					}
				}
			}
		}
		std::cout<<ans<<'\n';
	}else{
//		for(int i=1;i<=110000000;i++)
//		{
//			if(i*i>=23333333333333)
//			{
//				std::cout<<i;
//				break;
//			}
//		}
//4830549
		std::vector<int> v;
		for(int i=2;i<=5000000;i++)
		{
			if(isprime(i)) v.push_back(i);
		}
		//std::cout<<v.size()<<"xxx\n";
		ll ans=0;
		for(int i=0;i<v.size();i++)
		{
			for(int j=i+1;j<v.size();j++)
			{
				if((double)v[i]*v[i]*v[j]*v[j]<=23333333333333&&v[i]*v[i]*v[j]*v[j]>=2333) ans++;
				if((double)v[i]*v[i]*v[j]*v[j]>23333333333333) break;
			}
		}
		std::cout<<ans<<'\n';
		//947293
	} 
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

最后算出来是947293,偶对要开double,这题会爆ull,原来double比unsigned longlong大啊。

补个线性筛版本,快很多。

#include<bits/stdc++.h>
using ll=unsigned long long;
#define int ll
const int N=5e6+10;
int k=0;
std::string s;
bool st[N];
void solve()
{
		std::vector<int> v;
		for(int i=2;i<=5000000;i++)
		{
			if(!st[i]) v.push_back(i);
			for(int j=0;j<v.size()&&v[j]<=5000000/i;j++)
			{
				st[v[j]*i]=1;
			}
		}
		//std::cout<<v.size()<<"xxx\n";
		ll ans=0;
		for(int i=0;i<v.size();i++)
		{
			for(int j=i+1;j<v.size();j++)
			{
				if((double)v[i]*v[i]*v[j]*v[j]<=23333333333333&&v[i]*v[i]*v[j]*v[j]>=2333) ans++;
			
				if((double)v[i]*v[i]*v[j]*v[j]>23333333333333) break;
			}
		}
		std::cout<<ans<<'\n';
		//947293
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

P8605 [蓝桥杯 2013 国 AC] 网络寻路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 DFS会t一个点。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;

const int N=1e5+10;
std::vector<int> g[N];
ll ans=0;
bool st[N];
void dfs(int fa,int x,int cnt)
{
	if(cnt==2)
	{
		for(auto i:g[x])
		{
			if(!st[i])
			{
				ans++;
			//	break;
			}
		}
		return ;
	}
	if(cnt>2) return ;
	
	for(auto i:g[x])
	{
		if(i==fa) continue;
		if(st[i]) continue;
		
		st[i]=1;
		dfs(fa,i,cnt+1);
		st[i]=0;
	}
}
void solve()
{
	int n,m;
	std::cin>>n>>m;
	while(m--)
	{
		int u,v;
		std::cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i=1;i<=n;i++)
	{
		dfs(i,i,0);
	}
	std::cout<<ans<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

实际上经过两个点,我们直接枚举边就好了,对于一条边的两个端点如果都还连着别的点,情况数就加上。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;

const int N=1e5+10;

ll ans=0;
int u[N],v[N];
int rd[N];
void solve()
{
	int n,m;
	std::cin>>n>>m;
	
	for(int i=1;i<=m;i++)
	{
		std::cin>>u[i]>>v[i];
		rd[v[i]]++,rd[u[i]]++;
	}
	for(int i=1;i<=m;i++)
	{
		if(rd[v[i]]>1&&rd[u[i]]>1)
		{
			ans+=(rd[v[i]]-1)*(rd[u[i]]-1);
		}
	}
	ans*=2;
	std::cout<<ans<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

P8738 [蓝桥杯 2020 国 C] 天干地支 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

就是一个模拟题,静下心模拟就好了。 

题目说1900是一个庚子年,1900%60=40,第一个庚子年是0040,然后%10,%12会发现0000是一个庚申年,然后随意输入一个年份在0000的基础上模拟就好。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;
#define int ll 
const int N=1e5+10;

std::string a[]={"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
std::string b[]={"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
void solve()
{
	int y;
	std::cin>>y;
	int nowa=6,nowb=8;
	
	y%=60;
	int x=y%10,p=y%12;
	std::cout<<a[(nowa+x)%10]<<b[(nowb+p)%12]; 
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

P8697 [蓝桥杯 2019 国 C] 最长子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 完全用不上dp,指针模拟即可。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;
//#define int ll 
const int N=1e5+10;

void solve()
{
	std::string s,t;
	std::cin>>s>>t;
	
	int cnt=0;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]==t[cnt]) cnt++;
	}
	std::cout<<cnt<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

P8654 [蓝桥杯 2017 国 C] 合根植物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这题想到并查集就是个板子题了,然后就是最后数集合的个数就直接数有几个根即可。

考前还是要复习一下并查集的板子。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;
//#define int ll 
const int N=1e6+10;
int p[N];
ll find(int x)
{
	if(p[x]!=x)
	{
		p[x]=find(p[x]);
	}
	return p[x];	
}
void merge(int a,int b)
{
	int pa=find(a),pb=find(b);
	if(pa!=pb) 
	{
		p[pa]=pb;
	}
}
void solve()
{
	int n,m;
	std::cin>>m>>n;
	for(int i=1;i<=m*n;i++)
	{
		p[i]=i;
	}
	
	int k;
	std::cin>>k;
	while(k--)
	{
		int a,b;
		std::cin>>a>>b;
		merge(a,b);
	}
	
	ll ans=0;
	for(int i=1;i<=m*n;i++)
	{
		if(p[i]==i) ans++;
	}
	std::cout<<ans<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

P8604 [蓝桥杯 2013 国 C] 危险系数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意就是输出a到b中间有几个点是必走的。

这样,我们数出a到b一共有几条路,然后对每次正确的路经过的点计数。统计有多少个点经过的次数与总路线数相同就必走的点。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;
//#define int ll 
const int N=1e6+10;
std::vector<int> g[N];
int s,e;
ll cnt=0;
bool st[N];
int c[N];
int n,m;
void dfs(int x)
{
	if(x==e)
	{
		cnt++;
		for(int i=1;i<=n;i++)
		{
			if(st[i]) c[i]++;
		}
		return ;
	}
	
	for(auto i:g[x])
	{
		if(st[i]) continue;
		
		st[i]=1;
		dfs(i);
		st[i]=0;
	}
}
void solve()
{
	
	std::cin>>n>>m;
	
	while(m--)
	{
		int a,b;
		std::cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	
	//u到v必须经过的点 
	std::cin>>s>>e;
	st[s]=1;
	dfs(s); 
	
	if(cnt==0)
	{
		std::cout<<-1<<'\n';
		return ;
	}
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		if(c[i]==cnt) ans++;
	}
	ans-=2;
	std::cout<<ans<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

 P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

模拟即可。

拼接平方数的定义是,这个数本身是完全平方数,还能拆成2个完全平方数。

#include<bits/stdc++.h>
using ll=unsigned long long;
using i128=__int128;
//#define int ll 
const int N=1e6+10;
std::vector<int> g[N];
int s,e;
ll cnt=0;
bool is(int x)
{
	int t=std::sqrt(x);
	return t*t==x;
}
void solve()
{
	int a,b;
	std::cin>>a>>b;
	for(int i=a;i<=b;i++)
	{
		std::string s=std::to_string(i);
		for(int j=1;j<s.length();j++)
		{
			int x=i/std::pow(10,j);
			int y=i%((int)std::pow(10,j));
			if(x==0||y==0) continue;
			
			if(is(i)&&is(x)&&is(y))
			{
				std::cout<<i<<'\n';
				break;
			}
		}
	}
	
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
} 

P8641 [蓝桥杯 2016 国 C] 赢球票 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

模拟即可。

#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
#define fir first
#define sec second
#define int ll

const int N=1e6+10;
const int mod=1e9+7;

int a[N];
bool st[N];
void solve()
{
	int n;
	std::cin>>n;
	for(int i=0;i<n;i++)
	{
		std::cin>>a[i];
	}
	ll maxn=0,now=1,cnt=1;
	for(int i=0;i<n;i++)
	{	
		memset(st,0,sizeof st);
		ll s=0;
		cnt=1,now=i;
		while(1)
		{
			while(st[now%n]||a[now%n]!=cnt)
			{	
				if(now>100000) break;
				if(st[now%n]) 
				{
					now++;
					continue;
				}
				now++,cnt++;
			}
			if(a[now%n]==cnt&&st[now%n]==0)
			{
				st[now%n]=1;
				s+=a[now%n];
				cnt=1;
				now++;
			}else break;
		}
		//std::cout<<i<<" "<<s<<'\n';
		maxn=std::max(maxn,s);
	}
	std::cout<<maxn<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

P9421 [蓝桥杯 2023 国 B] 班级活动 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一点点思维。

重复的是必须要改的,然后缺的队数也是至少要改的,取个最大值即可。 

#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
#define fir first
#define sec second
#define int ll

const int N=1e6+10;
const int mod=1e9+7;

int a[N];
void solve()
{
	int n;
	std::cin>>n;
	std::map<int,int> mp;
	for(int i=1;i<=n;i++)
	{
		std::cin>>a[i];
		mp[a[i]]++;
	}
	ll ans=0,cnt=0,p=0;
	for(auto i:mp)
	{
		if(i.sec>=2)
		{
			ans+=i.sec-2;//至少要改这么多 
			cnt++;//有几队 
		}else{
			p++;
		} 
	}
	//凑好了cnt队,必须要改的 
	std::cout<<std::max((n-cnt*2)/2,ans)<<'\n';
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	//std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

P8700 [蓝桥杯 2019 国 B] 解谜游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

我写不出来看的题解感觉好简单,有点接近cf思维题了。

P8700 [蓝桥杯 2019 国 B] 解谜游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
#define fir first
#define sec second
#define int ll

const int N=1e6+10;
const int mod=1e9+7;

int a[N];
bool st[N];
void solve()
{
	std::string a,b,c;
	std::cin>>a>>b>>c;
	std::map<char,int> mp;
	
	for(int i=0;i<4;i++)
	{
		mp['G']=mp['Y']=mp['R']=0;
		
		mp[a[i]]++,mp[b[i]]++,mp[c[i]]++;
		
		mp[a[i+4]]++,mp[a[i+8]]++;				
		mp[b[i+4]]++;
		
		//std::cout<<mp['G']<<" "<<mp['R']<<" "<<mp['Y']<<'\n';
		if(mp['G']==3&&mp['R']==2&&mp['Y']==1)
		{
			continue;
		}
		std::cout<<"NO\n";
		return ;
	} 
	std::cout<<"YES\n";
}
signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	int t=1;
	std::cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

P8692 [蓝桥杯 2019 国 C] 数正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 推结论。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;
int n,ans;
signed main()
{
	cin>>n;
	for(int i = 1;i<n;i++)
		ans+=i*(n-i)*(n-i),ans%=mod;
	cout<<ans;
	return 0;
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值