蓝桥杯真题——洛谷Day12 枚举、数字三角形dp(二维dp)、找规律

目录

枚举

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

思路:

带有质因数分解模板的代码:

简洁代码:

P8627 [蓝桥杯 2015 省 A] 饮料换购 

数字三角形dp(二维dp)

P8707 [蓝桥杯 2020 省 AB1] 走方格

找规律&模拟题

P8700 [蓝桥杯 2019 国 B] 解谜游戏

 P8748 [蓝桥杯 2021 省 B] 时间显示


枚举

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

质因数定义:

思路:

 所以,我们先将读入的 n 进行质因数分解。对于分解的每一个质数,如果它的指数为奇数,则 x 的因子就必须有这个质数。 

特判:注意题目要求,n不一定是完全平方数,n*x才是 ,所以会出现n未除尽的情况,因为n这时不是完全平方数

带有质因数分解模板的代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;

const int N=2e6+10;
ll n;
ll cnt;//每个质因子的位置 ,同时表示质因子的个数 
ll ans;
ll p[N],g[N];//质因子,质因子指数 
int main()
{
	cin>>n;//注意题目要求,n不一定是完全平方数,n*x才是 
	for(ll i=2;i*i<=n;i++)//枚举的范围是2~根号n
	{
		if(n%i==0) cnt++;//作为每个质因子的位置标号
//		p[cnt]=i;//存入质因子 
		while(n%i==0)//进行循环求n每一个质因子的指数 
		{
			p[cnt]=i;
			g[cnt]++;
			n/=i; 
		 } 
	 }
	if(n>1)//特判:当n没有被除尽时需要将剩下的数存入数组
			//如:360的质因子为2(^3),3(^3),5,在这种情况下将5特判存入	 
	{
		p[++cnt]=n;
		g[cnt]++;
	 } 
	//以上是质因数分解模板
	
	 ans=1;
	for(int i=1;i<=cnt;i++) 
	{
		if(g[i]%2)//如果指数是奇数 ,不一定只有一个数指数是奇数,所有ans要用到* 
			ans*=p[i];//那么就要补上一个这个质数
	}
	cout<<ans<<endl;
	return 0;
}

简洁代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=2e6+10;
long long int n,ans=1;
long long int pri[N];

int main()
{
	cin>>n;
	for(long long int i=2;i*i<=n;i++)
	{
		int cnt=0;//计数,表示质因数pri[i]的指数 
		while(!(n%i)) cnt++,n/=i;
		if(cnt%2) ans*=i;//如果指数不是偶数,在x中要有一个这样的只因子,保证指数为偶数 
	}
	if(n>1) ans*n;//注意n没有分尽的情况 
	cout<<ans<<endl;
	return 0 ;
}

P8627 [蓝桥杯 2015 省 A] 饮料换购 

#include<iostream>

using namespace std;

int main()
{
	int n;
	cin>>n;
	int ans=n;//总共能喝到的饮料数,一开始是n瓶 
	while(n>2)//对瓶盖换购情况进行遍历
	{
		ans+=n/3;
		int r=n%3;//换后剩下的瓶盖 
		n/=3;
		n+=r;
	 } 
	cout<<ans<<endl;
	return 0;
}

数字三角形dp(二维dp)

P8707 [蓝桥杯 2020 省 AB1] 走方格

这是一个三角形dp问题,首先要想到求解dp问题时的四个步骤:动态规划四步骤:定义数组、状态转移方程、初始化、写递推

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=100+10;
int n,m;
int f[N][N];//f[i][j]表示到第i行第j列的方案数 
int main()
{
	cin>>n>>m;
	f[1][1]=1;//初始化 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			f[i][j]+=f[i-1][j];//走行方向
			f[i][j]+=f[i][j-1];//走列方向
			if(i%2==0&&j%2==0)
				f[i][j]=0;//不能走,方案数设为0 
		}
	}
	cout<<f[n][m]<<endl;
	return 0;
}

找规律&模拟题

P8700 [蓝桥杯 2019 国 B] 解谜游戏

思路 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;

int t; 
string a,b,c;//外圈 中圈 内圈 

int main()
{
	cin>>t;
	while(t--)
	{
		int flag=0;
		cin>>a>>b>>c;//外 中 内 
		for(int i=0;i<4;i++)//遍历内圈的4个棒
		{
			//将桶设在for循环内,保证每次对新的测试点都有新的桶 
			map<char,int> mp;//设置一个桶,存放每次遍历的棒和对应颜色棒的数量
			mp[a[i]]++,mp[a[i+4]]++,mp[a[i+8]]++;//外圈有三个对应的位置
			mp[b[i]]++,mp[b[i+4]]++;//中圈有对应的两个位置
			mp[c[i]]++; 
			if(mp['Y']!=1||mp['R']!=2||mp['G']!=3)
			{
				flag=1;
			}
		 }
		if(flag)
		 	cout<<"NO"<<endl;
		else 
			cout<<"YES"<<endl;
			
	}
	return 0;	
}

 P8748 [蓝桥杯 2021 省 B] 时间显示

注意:long long 为1e18,使用longlong 类型

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

typedef long long ll;

int main()
{
	ll n;
	cin>>n;
	n/=1000;//将毫秒换为秒
	ll h=n/3600%24;//小时,1h=3600s,小时取大于3600s的,所以用除,并且
				   //题目要求小时是0~23,所以需要模与24 
	ll m=n%3600/60;//分,小于3600s(1h),大于60(1s) 
	ll s=n%60;//秒,小于1s 
	printf("%02d:%02d:%02d",h,m,s);
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值