2020蓝桥杯B组C++真题题解

A:门牌制作

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要为一条街的住户制作门牌号。

这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。

小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。

请问要制作所有的 1到 2020 号门牌,总共需要多少个字符 2?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

填空题,挨个遍历,送分题,要把握住; 

#include <iostream>
using namespace std;
int ans;
int main()
{
  for(int i=1;i<=2020;i++){
    int c=i;
    while(c){
      int a=c%10;
      if(a==2){
        ans++;
      }
      c=c/10;
    }
  }
  cout<<ans;
  return 0;
}

 

B:既约分数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。

例如43​,81​,17​, 都是既约分数。

请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1和 2020)?

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 128M

没啥说的,遍历就行了,才2020个数;

#include <iostream>
using namespace std;
int gcd(int a,int b){
  return b==0?a:gcd(b,a%b);   //最大公约数
}
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;
  return 0;
}

C:蛇形填数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下图所示,小明用从 11 开始的正整数“蛇形”填充无限大的矩阵。

1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20列的数是多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

 找规律,每次增加4*(i-1),i为行列数,第二行第二列就是1+4*1=5,三就是5+4*2=13,以此类推,实在不行挨个列出来都行,so easy;

#include <iostream>
using namespace std;
int main()
{
  int sum=1;
  for(int i=1;i<20;i++){
    sum=sum+i*4;
  }
  cout<<sum;
  return 0;
}

 D:七段码

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要用七段码数码管来表示一种特殊的文字。

上图给出了七段码数码管的一个图示,数码管中一共有 77 段可以发光的二 极管,分别标记为 a,b,c,d,e,f,g。

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。

例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。

例如:a,b,c,d,e 发光,f,g 不发光可以用来表达一种字符。

例如:b,f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。

请问,小蓝可以用七段码数码管表达多少种不同的字符?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

总通过次数: 6415  |  总提交次数: 7026  |  通过率: 91.3%

难度: 简单   标签: 填空题, 2020, 省赛

其实啊我感觉数一下用的时间更少

#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
set<string> num;
int c[4][2]={
   
   {-1,0},{0,-1},{1,0},{0,1}};
string a[3];
int d[5][5];
int ans;
void dfs(int x,int y,string r){
  d[x][y]--;
  for(int i=0;i<4;i++){
    int tx=x+c[i][0];
    int ty=y+c[i][1];
    if(tx>=0&&tx<3&&ty>=0&&ty<3&&d[tx][ty]!=0&&a[tx][ty]!='*'){
    	sort(r.begin(),r.end());
    	num.insert(r);
    	
    	if(d[1][1]==1&&tx==1&&ty==1){
    		dfs(tx,ty,r);
		}
		else{
			dfs(tx,ty,r+a[tx][ty]);
		}
      num.insert(r);
    }
  }
  d[x][y]++;

}
int main()
{
  for(int i=0;i<3;i++){
  	for(int j=0;j<3;j++){
  		d[i][j]=1;
	  }
  }
  d[1][1]=2;
  a[0]="abb";
  a[1]="fgc";
  a[2]="eed";
  for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
    	if(a[i][j]!='*'){
    		string r="";
    		r+=a[i][j];
      		dfs(i,j,r);
		}
       
    }
  }
//  for(set<string>::iterator it=num.begin();it!=num.end();it++){
//  	cout<<*it<<endl;
//  }
  cout<<num.size()/2;
  return 0;
}

E:跑步锻炼

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。

小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

一天天遍历判断这一天加几就好了

#include <iostream>
using namespace std;
int month12[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long long ans;
int main(){
	int year=2000;
	int month=1;
	int day=1;
	int xingqi=6;
	while(1){
		if(year%400==0 || (year%100!=0 && year%4==0)){
			month12[1]=29;
		}else{
			month12[1]=28;
		}
		if(day==1||xingqi==1){
			ans+=2;
		}else{
			ans++;
		}
		if(day==month12[month-1]){
			day=1;
			month++;
		}else{
			day++;
		}
		if(month==13){
			month=1;
			year++;
		}
		if(xingqi==7){
			xingqi=1;
		}
		else{
			xingqi++;
		}
		if(year==2020&&month==10&&day==2){
			break;
		}
	}
	cout<<ans;
	return 0;
}

 F:回文日期

题目描述

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。

也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述

输入包含一个八位整数 NN,表示日期。

对于所有评测用例,10000101≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。

输出描述

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例

示例

输入

20200202

输出

20211202
21211212

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

回文日期就是前四个和后四个对称呗,从最小开始遍历,只取前四位,倒过来后判断是否符合实际,符合存储下来。然后打印第一个,然后找第一个ABABBABA类型的,就是在原来基础上前两位和三四位相等呗,遍历一下数组,打印第一个。

#include <iostream>
using namespace std;
int n;
int c;
int month12[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int shu[4];
int s[1000000];
bool check(int x){
	if(x%400==0 || (x%100!=0 && x%4==0)){
		month12[1]=29;
	}else{
		month12[1]=28;
	}
	int mm=x;
	int cc=0;
	while(mm){
		shu[cc]=mm%10;
		mm=mm/10;
		cc++;
	}
	if(shu[0]==0 && shu[1]<=9&& ((shu[2]*10+shu[3])<=month12[shu[1]-1])){
		return true;
	}
	else if(shu[0]==1&&shu[1]<=2&& ((shu[2]*10+shu[3])<=month12[10+shu[1]-1])){

		return true;
	}
	else{
		return false;
	}

}

int main(){
	cin>>n;
	int v=0;
	int m=n/10000;
	for(int i=m+1;i<=10000;i++){
		if(check(i)){
			s[v]=i*10000+shu[0]*1000+shu[1]*100+shu[2]*10+shu[3];
			v++;

		}
	} 
	cout<<s[0]<<endl;
	for(int i=0;i<v;i++){
		int nn=s[i]/10000;
		int nnn=nn/100;
		int nnnn=nn%100;
		if(nnn==nnnn){
			cout<<s[i];
			break;
		}
	}
	return 0;
}

 万万没想到啊

 90,就差一奈奈,我真的会谢啊。不想改了,就这样吧,卒。

G:字串排序

题目描述

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。

在冒泡排序中,每次只能交换相邻的两个元素。

小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,在所有可能的排序方案中,冒泡排序的总交换次数是最少的。

例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。

小蓝的幸运数字是 VV,他想找到一个只包含小写英文字母的字符串,对这个串中的字符进行冒泡排序,正好需要 VV 次交换。请帮助小蓝找一个这样的字符串。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。

输入描述

输入一行包含一个整数 (1≤V≤104),为小蓝的幸运数字。

输出描述

输出一个字符串,为所求的答案。

输入输出样例

示例 1

输入

4

输出

bbaa

示例 2

输入

100

输出

jihgfeeddccbbaa

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

#include<iostream>
using namespace std;
const int N = 1e5+5;
char str[N];
int main(){

	int n; 
	cin>>n;
	int r=0;
	while(r*(r+1)/2<n)r++;   //等差序列和
	r++;
	int t=(r-1)*r/2-n;       //r个字母最大逆系数为t
	str[r-1]='a';
	for(int i=r-2;i>=0;i--){		
		if(t>r/2){         //这时要有三个相同字母存在
			str[i]=str[i+1];
			i--;
			str[i]=str[i+1];
			i--;
			t-=3;
		}else if(t>0){
			str[i]=str[i+1];
			i--;t--;
		}
		if(i>=0)str[i]=str[i+1]+1;
	}
	puts(str);
	return 0;
}

 

 H:成绩统计

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入描述

输入的第一行包含一个整数 (1≤n≤104),表示考试人数。

接下来 nn 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

输入输出样例

示例

输入

7
80
92
56
74
88
100
0

输出

71%
43%

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

 注意舍弃就行了。转移int时加上0.5就行了。地板舍弃原来是

#include <iostream>
using namespace std;
int n;
int hege,youxiu;
int main()
{
  cin>>n;
  for(int i=0;i<n;i++){
    int x;
    cin>>x;
    if(x>=60){
      hege++;
      if(x>=85){
        youxiu++;
      }
    }
  }
   int a=hege*100.0/n*1.0+0.5;
   int b=youxiu*100.0/n*1.0+0.5;
  printf("%d%\n%d%",a,b);
  return 0;
}

 

I:字串分值和

题目描述

对于一个字符串 SS,我们定义 SS 的分值 f(S) 为 SS 中出现的不同的字符个数。例如 f(“aba”) = 2,f(“abc”) = 3, f(“aaa”) = 1。

现在给定一个字符串 S[0...n−1](长度为 nn),请你计算对于所有 S 的非空子串 f(S [i...j])f(S[i...j]) 的和是多少。

输入描述

输入一行包含一个由小写字母组成的字符串 SS。

其中,1≤n≤105。

输出描述

输出一个整数表示答案。

输入输出样例

示例 1

输入

ababc

输出

28

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

 找每个字母的价值,找到某个字母下标与上一个相同字母之间的距离,然后再计算出到末尾之间的距离。两个距离乘积就是该字母的价值。求出每个字母价值,累加就好了

#include <iostream>
#include <string> 
using namespace std;
string s;
long long sum;
int last[1005];
using namespace std;
int main(){
	cin>>s;
	int a=s.size();          //字符串的长度 
	s=' '+s;                 //避免为0情况出现
	for(int i=1;i<=a;i++){
		sum+=(long long)(i-last[s[i]])*(a-i+1);     //last储存上一次该字母出现的下标
		                                 //i-last[s[i]]表示,距离上一个字母出现的距离,(a-i+1)表示到最后的距离 
		last[s[i]]=i;
	} 
	cout<<sum;
	return 0;
}

 

J:平面切分

题目描述

平面上有 N 条直线,其中第 ii 条直线是 y=Ai​×x+Bi​。

请计算这些直线将平面分成了几个部分。

输入描述

第一行包含一个整数 NN。

以下 NN 行,每行包含两个整数 Ai​,Bi​。

其中,1≤N≤1000,−105≤Ai​,Bi​≤105。

输出描述

一个整数代表答案。

输入输出样例

示例

输入

3
1 1
2 2
3 3

输出

6

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

一开始有一个平面,每多一个直线至少加一个平面,该直线与其余直线每有一个交点就多加一。 

#include <iostream>
#include <set>
using namespace std;
int ans,n;
set<pair<double,double> > xian;


void chick(double k1,double b1){
	set<pair<double,double> > dian;
	int k2,b2;
	for(auto it:xian){
		k2=it.first;
		b2=it.second;
		if(k1!=k2){
			double x=(b1-b2)/(k1-k2);
			double y=k1*x+b1;
			dian.insert(make_pair(x,y));
		}
	}
	ans+=dian.size();
	dian.clear();
}


int main(){
  ans=1;
	cin>>n;
	for(int i=0;i<n;i++){
		double k=0;
		double b=0;
		cin>>k>>b;
		int len=xian.size();
		xian.insert(make_pair(k,b));
		if(len!=xian.size()){
			ans++;        //固定加一,有一个交点额外加一 
			chick(k,b);
		}
	}
  cout<<ans;
	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/m0_73731708/article/details/129290566