蓝桥杯2020第十一届C/C++B组题解

蓝桥杯2020第十一届C/C++B组题解

  • 试题A:门牌制作
  • 试题B:既约分数
  • 试题C:蛇形填数
  • 试题D:跑步锻炼
  • 试题E:七段码
  • 试题F:成绩统计
  • 试题G:回文日期
  • 试题H:子串分值和
  • 试题I:平面切分
  • 试题J:字串排序

试题A:门牌制作

蓝桥杯2020第十一届C/C++B组题解_第1张图片
这题不想说什么,循环判断一下有没有2就行,有2就计数。(为了省事,就写在主函数里了)

#include
#include
#include
#include

using namespace std;

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

答案:624

试题B:既约分数

蓝桥杯2020第十一届C/C++B组题解_第2张图片
这题考的是辗转相除,也叫欧几里得公式。(附上一个模板)题意没说分子分母不能相等,所以第二重循环也从1开始。

//欧几里得公式(辗转相除法)得最小公因数
int gcd(int a, int b)
{
     
    return b ? gcd(b, a % b) : a;
}
#include
#include
#include
#include

using namespace std;

int gcd(int a,int b){
     
	return b ? gcd(b,a%b) : a;
}

int main(){
     
	int count=0;
	for(int i=1;i<=2020;i++){
     
		for(int j=1;j<=2020;j++){
     
			if(gcd(i,j)==1) count++;
		}
	}
	cout<<count<<endl;
}

答案:2481215

试题C:蛇形填数

蓝桥杯2020第十一届C/C++B组题解_第3张图片
不得不说这题是挺蛇皮的。 这题我用了点小脑筋,对于(i,i)这个点,它的第一行的对应坐标是(2i - 1,0),那么题目也就替换成了找到第一行第39个数多少就可以求出(20,20)。那么我们就只需要找到第一行的规律就行,他们之间的差为1,4,1,8,1,12…是不是发现奇数是加1,偶数是加一个4的倍数呢。然后发现第一行第39个数是末尾,所以再减去19就可以得到答案了。

#include
#include
#include
#include

using namespace std;

int main(){
     
	int x=1;
	for(int i=2,count=4;i<=39;i++){
     
		if(i%2==1) x++;
		else{
     
			x+=count;
			count+=4;
		}
	}
	cout<<(x-19)<<endl;
}

试题D:跑步锻炼

蓝桥杯2020第十一届C/C++B组题解_第4张图片
这题的题解我放在代码上了。其实难度不大,简单粗暴明了。

#include
#include
#include
#include

using namespace std;

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

int isr(int n){
     
	if(n%4==0&&n%100!=0) return true;
	if(n%400==0) return true;
	return false;
}

int main(){
     
	int count=0;//保存结果
	int date=6;//记录是星期几,判断是否是月初的条件,我把它放在循环中,如果d是1,那么就是月初 
	//第一层循环,循环年数,还得判断是否是闰年,如果是闰年2月得+1 
	for(int y=2000;y<=2020;y++){
     
		//第二层循环,循环月数
		//如果是闰年,二月是29天 
		if(isr(y)==1) mon[2]++;
		for(int m=1;m<=12;m++){
     
			//第三层循环,循环天数 
			for(int d=1;d<=mon[m];d++){
     
				//如果是月初或是星期一就跑2km,否则跑1km 
				if(date==1||d==1) count+=2;
				else count++;
				if(date==7) date=1;
				else date++;
				if(y==2020&&m==10&&d==1){
     
					cout<<count<<endl;
					return 0;
				}
			}
		}
		//对二月进行一个状态回归 
		if(isr(y)==1) mon[2]--;
	}
	return 0;
}

答案:8879

试题E:七段码


这题我是数出来的。谁叫他是填空题呢。 啊哈哈。
1根管:7种情况。(只有一个亮)
2根管:10种情况。(只用两个亮)
3根管:16种情况。
4根管:20种情况。
5根管:19种情况。(反向思维:不能选两个对着的,否则他俩中间的会断掉,只有fb和ec这两组断了就会有一个被隔离,而ag和gd不会,所以C53 - 2就行)
6根管:7种情况。(反向思维:选一个不亮就行)
7根管:1种情况。
答案:80

试题F:成绩统计


蓝桥杯2020第十一届C/C++B组题解_第5张图片
水题似乎没什么好讲的,C++似乎自身不带进一操作,这里结果做个进一操作即可。

#include
#include
#include
#include

using namespace std;

int n;

int main(){
     
	cin>>n;
	int count1=0;	//及格人数 
	int count2=0;	//优秀人数 
	for(int i=0;i<n;i++){
     
		int tmp;
		cin>>tmp;
		if(tmp>=60) count1++;
		if(tmp>=85) count2++;
	}
	int re1,re2;
	re1 = ((count1 * 1.0 / n) + 0.005) * 100;
	re2 = ((count2 * 1.0 / n) + 0.005) * 100;
	printf("%d\%\n%d\%\n",re1,re2);
	return 0;
}

试题G:回文日期


蓝桥杯2020第十一届C/C++B组题解_第6张图片
这题也是道暴力模拟题,把每个值取出来做个判断即可。就是如此粗暴

#include
#include
#include
#include
using namespace std;

int ys,yd;
int ans=0;
int datemp[]={
     0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断是否为闰年 
bool judge(int n){
     
    if((n%4==0&&n%100!=0)||n%400==0) return 1;
    else return 0;
}
//检查年份是否可以回文 
bool check(int n){
     
    int a,b,c,d;
    int year=n;
    a=n%10;
    n/=10;
    b=n%10;
    n/=10;
    c=n%10;
    n/=10;
    d=n%10;
    int month,date;
    month=a*10+b;
    date=c*10+d;
    if(month>12||date>31){
     
        return 0;
    }
     else if(judge(year)){
     
        if(month==2&&date<=29) return 1;
        else return date<=datemp[month];
    }
    else return date<=datemp[month];
}

int get(int n){
     
    int year=n;
    int a,b,c,d;
    a=n%10;
    n/=10;
    b=n%10;
    n/=10;
    c=n%10;
    n/=10;
    d=n%10;
    return year*10000+a*1000+b*100+c*10+d;
}

int main(){
     
    cin>>ys>>yd;
    int n,m;
    n=ys/10000;
    m=yd/10000;
    for(int i=n;i<=m;i++){
     
        if(check(i))
            if(get(i)>=ys&&get(i)<=yd) ans++;
    }
    cout<<ans<<endl;
    return 0;
}

试题H:子串分值和

蓝桥杯2020第十一届C/C++B组题解_第7张图片
蓝桥杯2020第十一届C/C++B组题解_第8张图片
这题看似是一道字符串题目,本质却是一道动态规划。(个人感觉最近蓝桥杯越来越偏向动态规划了。)
此题的解题姿势是“竖着看”。
蓝桥杯2020第十一届C/C++B组题解_第9张图片
(字丑勿喷,谢谢您了)

#include
#include
#include
#include

using namespace std;

typedef long long ll;

ll dp[26]={
     0};

int main()
{
     
	string s;
	cin>>s;
	int n=s.length();
	ll sum=0;
	for(int i=0;i<n;i++){
     
		int t=s[i]-'a';
		sum+=(i+1-dp[t]) * (n-i);
		dp[t]=i+1;
	}
	cout<<sum<<endl;
	return 0;
}

注意一下,可能需要定义longlong型,极大可能超过int型

试题I:平面切分

蓝桥杯2020第十一届C/C++B组题解_第10张图片
后面两题不急,容在下想想。

试题J:字串排序

蓝桥杯2020第十一届C/C++B组题解_第11张图片
蓝桥杯2020第十一届C/C++B组题解_第12张图片

你可能感兴趣的:(蓝桥杯)