第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组(10月17日) - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组(10月17日)

发表时间:2020-10-18

发布人:葵宇科技

浏览次数:64

在这里插入图片描述
签到题:答案624

#include<iostream>
using namespace std;
int sum;
void jisuan(int x){
	while(x){
		if(x%10==2) sum++;
		x/=10;
	}
}
int main()
{
	for(int i=1;i<=2020;i++) jisuan(i);
	cout<<sum<<endl;
	return 0;
}

在这里插入图片描述
答案:2481215
暴力枚举分子分母即可。

#include<iostream>
using namespace std;
int sum=0;
int gcd(int x,int y){
	if(x%y==0) return y;
	return gcd(y,x%y);
}
int main()
{
	for(int i=1;i<=2020;i++)
	for(int j=1;j<=2020;j++)
	if(gcd(i,j)==1) sum++;
	cout<<sum<<endl;
	return 0;
}

在这里插入图片描述
答案:761
解析:找规律题,不难发现对角线上的数字个数是一个1-n的等差数列,且第n行m列的数所在对角线上有n+m-1个数字,对角线上的数字为奇数时蛇形矩阵方向向上;n(n+1)/2+x
在这里插入图片描述
答案:8879
总的天数+月初且不是周一的天数+周一的天数

#include<iostream>
using namespace std;
int sum=0,s=0;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	for(int i=2000;i<2020;i++){
		if(i%4==0&&i%100!=0||i%400==0) month[2]++;
			for(int i=1;i<=12;i++){
				if((sum+6)%7!=1) s++;//计算是月初且不是周一的日子 
				sum+=month[i];
				
			}
			if(month[2]==29) month[2]--;
	}
	month[2]++;
	for(int i=1;i<=9;i++){ //2020年的前9个月 
			sum+=month[i];
			if((sum+6)%7!=1) s++;
	}
	sum+=2;//加上2020.10.1日
	int z=sum+s+(sum-2+6)/7;
	cout<<z<<endl;
	return 0; 
}

在这里插入图片描述
答案:80
7!种组合
暴搜每种组合,然后使用并查集或者搜索判断是否在一个连通块
在这里插入图片描述

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	double n;
	cin>>n; 
	double jg=0,yx=0;
	int x;
	int s=n;
	while(s--){
		cin>>x;
		if(x>=60) jg++;
		if(x>=85) yx++;
	}
	int j=((jg/n+0.005)*100),y=((yx/n+0.005)*100);
	cout<<j<<"%\n"<<y<<"%";
	return 0;
}

在这里插入图片描述
关键在于判断月份在1-12之间,天数不能越界

**关键在于判断月份在1-12之间,天数不能越界**
#include<iostream>
using namespace std;
int a;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	cin>>a;
	a=a/10000;
     for(int i=a+1;;i++){
       if(i%4==0&&i%100!=0||i%400==0) month[2]++;
     	int month1=(i%10)*10+(i/10)%10,day1=((i/100)%10)*10+i/1000;
		if(month[month1]>=day1&&month1>0&&month1<=12) {
			int year=i*10000+month1*100+day1;
			cout<<year<<endl;
			break;
		}
		if(month[2]==29) month[2]--;
	 }
	for(int i=a+1;;i++){
		if(i/100!=i%100) continue;
		if(i%4==0&&i%100!=0||i%400==0) month[2]++;
     	int month1=(i%10)*10+(i/10)%10,day1=((i/100)%10)*10+i/1000;
		if(month[month1]>=day1&&month1>0&&month1<=12) {
			int year=i*10000+month1*100+day1;
			cout<<year<<endl;
			break;
		}
		if(month[2]==29) month[2]--;
	}
	return 0; 
	
}

在这里插入图片描述
在这里插入图片描述
我写的纯暴力不知道能不能过

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N=100010;
string a;
int f[N];
// 纯暴力 
int main()
{
	cin>>a;
	int sum=0;
	for(int i=0;i<a.size();i++){
		map<char,int>p;
		memset(f,0,sizeof f);
		for(int j=i;j<a.size();j++) {
			if(!p[a[j]]) f[j+1]=f[j]+1;
			else f[j+1]=f[j];
			sum+=f[j+1];
			p[a[j]]=1;
		}
	}
		cout<<sum<<endl;
		return 0;
}

在这里插入图片描述
这道题的规律是每加入一条直线与其他直线有k个交点,即多产生k+1个区域(仅供参考)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int n;
//这道题的规律是每加入一条直线与其他直线有k个交点,即多产生k+1个区域 
struct point{
	int i,j;
/*	bool operator <(const point& t) const 
    {
        if(i!=t.i) return i<t.i;
        return j<t.j;
    }
*/ 
}p[1010];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++) scanf("%d%d",&p[i].i,&p[i].j);
//	sort(p,p+n);
	int sum=2;
	for(int i=1;i<n;i++){
		sum++;
		map<int,int>q;//存储当前直线与前面的直线的交点 
		for(int j=0;j<i;j++)
			if(p[j].i!=p[i].i){
				int x=(p[j].j-p[i].j)/(p[i].i-p[j].i);//x=(b1-b2)/(a2-a1) 
				int y=p[i].i*x+p[i].j+1;    //+1是为了特判y==0的情况 
			//	cout<<x<<" "<<q[x]<<endl;
			//	cout<<x<<" "<<y<<endl;
				if(q[x]!=y) sum++;         //出现新的交点即++ 
				q[x]=y;                    //存储当前交点 
			}
	}
	cout<<sum<<endl;
	return 0; 
}

在这里插入图片描述
在这里插入图片描述
目前还没有思路(太菜了!!!)

相关案例查看更多