2020年第十届蓝桥杯省赛C/C++B组第二场

点击查看 --------------->   题干

1、624

#include<iostream>
#include<cctype>
using namespace std;
int main(){
	int cnt=0;
	for(int i=1;i<=2020;i++){
		string s=to_string(i);
		for(int j=0;j<s.size();j++){
			if(s[j]=='2') cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

2、2481215

#include<iostream>
using namespace std;
int gcd(int a,int b){
	return (b==0)?a:gcd(b,a%b); 
}//求最大公因数 
int main(){
	int cnt=0;
	for(int i=1;i<=2020;i++)
		for(int j=1;j<=2020;j++){
			if(gcd(i,j)==1) cnt++;
		}
	cout<<cnt;
	return 0;
}

3、761  画图 <(20,20)在第39斜排的最中间>

4、8879   千万小心如果单算2020年10月1日,要 2(怪不得对答案的时候莫名其妙的少了1)

#include<iostream>
using namespace std;
int main(){
	int weekday=5,sum=0;
	for(int i=2000;i<=2019;i++){
		int flag=1;     //非闰年 
		if((i%4==0&&i%100!=0)||(i%400==0)) flag=0; //闰年
		int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
		if(!flag) a[1]=29;
		for(int j=1;j<=12;j++){
			for(int k=1;k<=a[j-1];k++){
				weekday++;
				if((weekday==1&&k!=1)||(weekday!=1&&k==1)||(weekday==1&&k==1)) sum+=2;
				else sum++;
				if(weekday==7) weekday=0;
			}
		} 
	}
	//2020年 
	int b[9]={31,29,31,30,31,30,31,31,30};
	for(int i=1;i<=9;i++){
		for(int k=1;k<=b[i-1];k++){
				weekday++;
				if((weekday==1&&k!=1)||(weekday!=1&&k==1)||(weekday==1&&k==1)) sum+=2;
				else sum++;
				if(weekday%7==0) weekday=0;
			}
	}
	sum+=2;//2020年 10月1日 ,注意是1号,是2km 
	cout<<sum; 
}

5、先略过了

6、round(),对浮点数四舍五入,最后返回整数。

      floor():向下取整   ceil():向上取整,头文件是#include<cmath>

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int n,jige=0,youxiu=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int score;
		cin>>score;
		if(score>=60) jige++;
		if(score>=85) youxiu++;
	}
	double jigelv=(double)jige/n*100;
	double youxiulv=(double)youxiu/n*100;
	jigelv=round(jigelv);
	youxiulv=round(youxiulv);
	cout<<jigelv<<"%"<<endl<<youxiulv<<"%";
	return 0;
}

7、在测试点3扣了10分,实在没有找出为什么

#include<iostream>
using namespace std;
int main(){
	int n,year,y,m,d,k;
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	cin>>n;
	y=n/10000,year=y,k=y;
	while(1){		//找下一个回文日期 
		year++;
		d=(year/1000)+(year%1000/100)*10;
		m=(year%100/10)+(year%100%10)*10;
		if((year%400==0)||(year%4==0&&year%100!=0)) a[2]=29;
		if(m<=12&&d<=a[m]){
			printf("%d%02d%02d\n",year,m,d);
			break;
		}
		else {
			a[2]=28;
			continue;
		}
	}
	while(1){		//找下一个ABABBABA型的回文日期
		k++;
		int k1=k/100,k2=k%100,m1=k1/10+k1%10*10;
		if(k1!=k2||m1>12) continue;
		else{
			printf("%d%02d%02d",k,m1,m1);
			break;
		}	
	}
	return 0; 
}

8、题干

这题太鬼了,直接就想暴力解题,但是看到很多大佬想到的这个方法,花了一些时间很艰难的把它弄懂了,不得不说这种做法真的太巧妙了,真的想不出来《= =》\\。

分析:

string s = "ababc";

  • 对于字符串s中的每一个字符,对其求所在的子串的数量,然后将所有字符所在的子串数量加和,就是最终的结果
  • s[0]='a'; 则s的所有子串中包含有s[0]的子串数为 1\times 5= 5 个
  • s[1]='b'; 则s的所有子串中包含有s[1]的子串数为 \left ( 1-0 \right )\times \left ( 5-1 \right )=4 个  [ 注意:(1-0)1是当前字符的下标,0是上一次该字符出现的下标,准确地讲不该是0,所以代码是将字符串最前边补上一个字符后从下标1开始的]
  • s[0]='a';则s的所有子串中包含有s[0]的子串数为\left ( 2-0 \right )\times \left ( 5-2 \right )=6
  • ······
  • 图示:

                 

#include<iostream>
using namespace std;
int last[26];
//26个字母,0-25分别是a-z的位置,每个位置存储此位置代表的字母在字符串中上一次出现的下标
int main(){
	string s;
	cin>>s;
	int len=s.size();
	s="0"+s;
	long long ans=0;
	for(int i=1;i<s.size();i++){
		ans+=1ll*(i-last[s[i]-'a'])*(len-i+1);
		last[s[i]-'a']=i;
	}
	cout<<ans;
	return 0;
}

这个代码可真是绝了!!!真是学到了

未完待续。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值