快捷搜索:

C/C++第十一届蓝桥杯省赛B组第二场比赛

C/C++第十一届蓝桥杯省赛B组第二场比赛

有错误各位大佬指出来哈。

1.找"2" 答案:624

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

int cnt(int num)
{
          
   
	int ans=0;
	while(num)
	{
          
   
		if(num%10==2)
			ans++;
		num/=10;
	}
	return ans;
}
int main()
{
          
   
	int ans=0;
	for(int i=1;i<=2020;i++)
		ans+=cnt(i);
	cout<<ans<<endl;
	return 0;
}

2.gcd函数,直接搞 答案:2481215

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
          
   
	int ans=0;
	for(int i=1;i<=2020;i++)
	{
          
   
		for(int j=1;j<=2020;j++)
		{
          
   
			if(__gcd(i,j)==1)
				ans++;
		}	
	}	
	cout<<ans<<endl;
	return 0;
}

3.蛇形图 答案:761

手算更快,等差数列搞一搞

4.跑步 答案:8879

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

int mon[13]={
          
   0,31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
          
   
	int y,m,d;
	cin>>y>>m>>d;
	int ans=0;
	int flag=0;
	int week=6;	//用来记录当天星期几
    //i,j,k 枚举年月日
	for(int i=2000;i<=y;i++)
	{
          
   
		for(int j=1;j<=12;j++)
		{
          
   
			int End=mon[j];
			if(((i%4==0&&i%100!=0)||i%400==0) && j==2)
				End++;
			for(int k=1;k<=End;k++)
			{
          
   
				ans++;
				if(week==1||k==1)
					ans++;
				if(++week==8)
					week=1;
				if(i==y&&j==m&&k==d)
				{
          
   
					flag=1;break;
				}
			}
			if(flag==1)
				break;
		}
	}
	cout<<ans<<endl;
	return 0;
}

5.灯管

这题手算的,算出来81,不知道对错……

6.及格率,四舍五入

不记得函数,先放大再缩小

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

int n;
void fun(int &num)
{
          
   
	if(num%10>4)
	{
          
   
		num/=10;
		num++;
	}else
		num/=10;
}
int main()
{
          
   
	cin>>n;
	int x;
	int cnt1=0;
	int cnt2=0;
	for(int i=0;i<n;i++)
	{
          
   
		cin>>x;
		if(x>=60)
			cnt1++;
		if(x>=80)
			cnt2++;
	}
	int ans1=(cnt1*1.0/n*1.0)*1000;
	int ans2=(cnt2*1.0/n*1.0)*1000;
	fun(ans1);fun(ans2);
	cout<<ans1<<"%"<<endl;
	cout<<ans2<<"%"<<endl;
	return 0;
}

7.下一个回文年份

枚举年份,生成对应的月日,判断合法性

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

int mon[13]={
          
   0,31,28,31,30,31,30,31,31,30,31,30,31};

char Input[10];

//通过年 得到回文的月日 同时检查年是否为abab 
void getMD(int y,int &m,int &d,int &ab)
{
          
   
	int temp[4]={
          
   0};
	int i=0;
	while(y)
	{
          
   
		temp[i++]=y%10;
		y/=10;
	}
	m=temp[0]*10+temp[1];
	d=temp[2]*10+temp[3];
	if(temp[0]==temp[2]&&temp[1]==temp[3])
		ab=1;
	else
		ab=0;
}

//检查年月日的合法性 
bool check(int y,int m,int d)
{
          
   
	if(((y%4==0&&y%100!=0)||y%400==0)&&m==2&&(d<1||d>mon[2]+1))
			return 0;
	if(m<1||m>12)
		return 0;
	if(d<1||d>mon[m])
		return 0;
	return 1;
}

int main()
{
          
   	
	scanf("%s",&Input);
	int staY=0;
	int x=1;
	for(int i=3;i>=0;i--)
	{
          
   
		staY+=(Input[i]-0)*x;
		x*=10;
	}
	int y1,m1,d1;
	int y2,m2,d2;
	int m,d,ab;
	int flag=0;
	for(int i=staY+1;i<=9999;i++)
	{
          
   
		getMD(i,m,d,ab);
		if(check(i,m,d))
		{
          
   
			//找到第一次就不会再找了 
			if(flag==0)
			{
          
   
				y1=i; m1=m;	d1=d;
				flag=1;
			}
			if(ab==1)
			{
          
   
				y2=i; m2=m; d2=d;
				break;
			}
		}
	}
	printf("%04d%02d%02d
",y1,m1,d1);
	printf("%04d%02d%02d
",y2,m2,d2);
	return 0;
}

8.算区间不同字母的个数,求和所由子区间

直接计算每个字母的贡献值,假设每个区间都是第一个出现的字母贡献,则每个字母贡献值是左边没出现相同字母乘上右边到最后的长度

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
string str;
ll last[26];	//记录26个字母上一次出现的位置 
ll ans=0;
int main()
{
          
   	
	for(int i=0;i<26;i++)
		last[i]=-1;
	cin>>str;
	ll len=str.size();
	for(ll i=0;i<len;i++)	
	{
          
   
		ans+=(i-last[str[i]-a])*(len-i);
		last[str[i]-a]=i;
	}
	cout<<ans<<endl;
	return 0;
}

9. 平面几何,这题不会,日后学会了来补

10.构造逆序字符串,优先最短,其次字典序最小

这题我找规律水过去了一半的数据,其实也不会写。就不贴代码献丑了

经验分享 程序员 微信小程序 职场和发展