蓝桥杯第五届省赛C/C++C组个人题解

版权声明:转载请注明出处https://blog.csdn.net/hhmy77 https://blog.csdn.net/hhmy77/article/details/88779606

武功秘籍

思维题 注意题目条件说明书本第一页为0
(0,1) (2,3) (3,4)…(n-1,n)
观察发现 如果是从奇数页开始 那么我们撕下此页 并且+1从偶数页算起
如果是从偶数页开始 则每撕一页就页数就加2
重复上述操作 我们一直撕到结束页为止

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int ans=0;
	int i=0;
	int n=0,m=0;
	cin>>n>>m;
	if(n%2!=0)
	{
		ans++,n++;		
	}
	for(i=n;i<=m;)
	{
		if(n%2!=0)
		{
			i++;
			ans++;
		}
		else
		{
			i+=2;
			ans++;	
		}
	} 
	cout<<ans;
}

等额本金

没什么好说的 细心一点不会错

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int sum=30000;
	int time=24;
	int rate=0.005;
	int mean=0;
	float num=0;
	float cnt=1250+sum*0.005;
	int n;cin>>n;
	for(int i=1;i<n;i++)
	{
		sum-=1250;
		cnt+=1250+sum*0.005;
	} 
	cout<<cnt;
//	cout<<1250+sum*0.005;
} 

猜字母

注意看题目 重复拼接字符串106次再操作
思路就是用string来存字符 然后用flag标记符合条件的字符,然后我们遍历flag取出没有被标记的字符串,直到剩下一个字符为止

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int sum=19;
	string str="abcdefghijklmnopqrs";
	string temp="";
	for(int i=0;i<106;i++)temp+=str;
	str=temp;
	while(sum!=1)
	{
		int flag[2014]={0};
		for(int i=0;i<sum;i+=2)
		{
			flag[i]=1;
		}
		string ts="";
		int cur=0;
		for(int i=0;i<sum;i++)
		{
			if(flag[i]==0)
			{
				cur++;
				ts+=str[i];
			}
		}
		str=ts;
		sum=cur;
	}
	cout<<str;

} 

大衍数列

i%2==0

打印图形

f(a,rank-1,row,col+w/2);;

神奇算式

我们遍历四个数 然后判断是否符合条件
接着再依次判断三个乘法的位置,找出成功的个数
然后我们用set去重

#include<bits/stdc++.h>
using namespace std;
int ary[4]={0};
int ans=0;
map<pair<int,int>,int>mp;
int book[1000]={0};
//注意看题目要求 乘法交换律是一种情况
//所以要去重 
int judge()
{
	//0 1 2 3
	//1 2 3 4
	// * * *
	//依次判断三种乘法情况
	int cnt=0;
	int A=0;
	int B=0; 
	for(int i=1;i<=3;i++)
	{
		bool ok=true;
		A=0;
		B=0;
		int flag[10]={0};
		for(int j=0;j<i;j++)
		{
			A=A*10+ary[j];
			flag[ary[j]]=1;
		}	
		for(int k=i;k<=3;k++)
		{
			B=B*10+ary[k];
			flag[ary[k]]=1;
		}
		int C=A*B;
		if(C<1000||C>10000)ok=false;
		while(C)
		{
			//ary中的数字只出现过一次且每个都出现 
			flag[C%10]--;
			C/=10;
		}
		for(int i=0;i<10;i++)if(flag[i]<0)ok=false;
		if(mp[make_pair(A,B)]==1)ok=false;
		if(ok)
		{
			mp[make_pair(A,B)]=1; 
			mp[make_pair(B,A)]=1; 
			cnt++;
			printf("%d*%d=%d\n",A,B,A*B);
		}	
	}
	return cnt;
}
void dfs(int cur)
{
	if(cur==4)
	{
		ans+=judge();
		return;
	}
	for(int i=0;i<10;i++)
	{
		if(cur==0&&i==0)continue;
		ary[cur]=i;
		dfs(cur+1);
	}
}
int main()
{
	dfs(0);
	cout<<ans;
} 

绳圈

这道题dp我不会。。先空着吧

分糖果

这道题有毒!!
这道题表述首先没说分一半是向上还是向下取整。然后有一个特别大的问题题目没有说明白
由于是循环分糖果,那么A将会得到上一个人给的糖果,此时A应该给下一个人A当前总共的糖果数,这个逻辑没问题吧??然而正确的做法是分给下一个人A的原始糖果数。我一直再用新的一半来模拟。写得我都怀疑人生了,这么简单的题目…吐血
下面循环从那开始不要紧 保证走完一圈就行了

#include<bits/stdc++.h>
using namespace std;
int N;
int ary[100];
bool check(int a[])
{
	int s=a[0];
	for(int i=0;i<N;i++)
	{
		if(a[i]!=s)return false;
	}
	return true;
}
int main()
{
	cin>>N;
	for(int i=0;i<N;i++)
	{
		cin>>ary[i];	
	}
	int ans=0;
	while(!check(ary))
	{
		int temp=0;
		for(int i=0;i<N;i++)
		{
			if(i==0)
			{
				temp=ary[i]/2;
				ary[i]-=ary[i]/2;
			}
			else
			{
				ary[i-1]+=ary[i]/2;
				ary[i]-=ary[i]/2;
			}
		}
		ary[N-1]+=temp;
		for(int i=0;i<N;i++)
		{
			cout<<ary[i]<<" ";
		}
		cout<<endl;
		for(int i=0;i<N;i++)
		{
			if(ary[i]%2!=0)
			{
				ary[i]++;
				ans++;
			}
		}
	
	}
	cout<<ans;
} 

地宫取宝

记忆搜索 不会QAQ

小朋友排队

逆序数 不会QAQ

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/88779606