十一届蓝桥杯省赛第二场

门牌制作

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

624

既约分数

  • 二重循环内赋值一个n,m很关键,不然改变循环变量了
#include<bits/stdc++.h>
using namespace std;
int gcd(int n,int m){
	return m==0?n:gcd(m,n%m);
}
void swap(int*a,int*b){
	int*t;
	t=a;
	a=b;
	b=t;
}
int main(){
	int ans=0;
	for(int i=1;i<=2020;i++){
		for(int j=1;j<=2020;j++){
			int n=i,m=j;
			if(n<m){
				swap(n,m);
			}
			if(gcd(n,m)==1){
				ans++;
			}
		}
	}
	cout<<ans;
}


2481215

蛇形填数

手画画就出来了
1+42019/2
761

跑步锻炼

  • 犯了一个错误,==少写一个,找个半天bug
  • 还犯了一个错误,ans+2排除之后忘了写else
memcpy函数可以复制需要<cstring>头文件,
复制方法是
memcpy(copy,sourse,sizeof(copy));
#include<bits/stdc++.h>
using namespace std;
int ifyear(int y){
	if((y%4==0&&(y%100!=0))||y%400==0){
		return 1;
	}
	return 0;
}
int months1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int months2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int months[12];
int days=1;
int ans=0;
int md;
int main(){
	for(int y=2000;y<=2019;y++){
		if(ifyear(y))memcpy(months,months2,sizeof(months));
		else memcpy(months,months1,sizeof(months));
		for(int m=0;m<=11;m++){
			md=months[m];
			for(int d=1;d<=md;d++){
				if(d==1||(days+5)%7==1){
					ans+=2;
				}
				else ans++;
				days++;
			}
		}
	}
	memcpy(months,months2,sizeof(months));
	for(int m=0;m<=8;m++){
	    md=months[m];
		for(int d=1;d<=md;d++){
			if(d==1||(days+5)%7==1){
				ans+=2;
			}
			else ans++;
			days++;
		}
	}
	ans+=2;
	cout<<ans;
}



8879

七段码

想直接暴力写的,但是多算了,主要是是否处于同样一个连通器这件事情不好表示,看了别人思路发现是用dfs+并查集。也许可以尝试下硬数?反正总共128种,可能20分钟也数完了。

  • dfs忘了写return一直转
#include<iostream>
#include<vector>
using namespace std;
vector<int>pre(8);
vector<int>light(8);
int ans=0;
//邻接矩阵 
vector<vector<int>>dis={
 {0,1,0,0,0,1,0},
 {1,0,1,0,0,0,1},
 {0,1,0,1,0,0,1},
 {0,0,1,0,1,0,0},
 {0,0,0,1,0,1,1},
 {1,0,0,0,1,0,1},
 {0,1,1,0,1,1,0},
};
//并查集 
int find(int x){
	if(x!=pre[x]){
		return pre[x]=find(pre[x]);
		//路径压缩 
	}
	return pre[x];
}
void dfs(int d){
	if(d>7){
		for(int i=1;i<=7;i++)pre[i]=i;
		for(int i=1;i<=7;i++){
			for(int j=1;j<=7;j++){
				if(dis[i-1][j-1]&&light[i]&&light[j]){
					int X=find(i);
					int Y=find(j);
					if(X!=Y)pre[X]=Y; 
				}
			}
		}
		int k=0;//连通器的个数 
		for(int i=1;i<=7;i++){
			if(light[i]&&pre[i]==i)k++;
		}
		if(k==1)ans++;
		return;
	}
	light[d]=1;
	dfs(d+1);
	light[d]=0;
	dfs(d+1);
}

int main(){
	dfs(1);
	cout<<ans;
	return 0;
} 

成绩统计

算下最大值最小值平均分就行

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main(){
	int n;
	int max=-100;
	int min=101; 
	int sum=0;
	cin>>n;
	vector<int>point(n);
	for(int i=0;i<n;i++){
		cin>>point[i]; 
		if(point[i]>max)max=point[i];
		if(point[i]<min)min=point[i];
		sum+=point[i];
	}
	double ave=(double)sum/n;
	printf("%d\n",max);
	printf("%d\n",min);
	printf("%.2f",ave);
	return 0;
} 

回文日期

写了半天10个例子还5个超时,懒得优化了

  • 判断闰年是%不是/,老写错
#include<bits/stdc++.h>
using namespace std;
int months1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int months2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int ifyear(int y){
	if(((y%4==0)&&(y%100!=0))||y%400==0){
		return 1;
	}
	return 0;
}
int main(){
	int n,ans1,ans2,a,b;
	int months[12];
	scanf("%d",&n);
	int y0=n/10000-1;
	int y=y0;
	int d0=n%100;
	int m0=(n/100)%100;
	while(1){
		y=y+1;
		int t=y;
		int s[4];
		for(int i=0;i<4;i++){
			s[i]=t%10;
			t/=10;
		}
		int m,d;
		m=s[0]*10+s[1];
		d=s[2]*10+s[3];
		if(m0>m||(m0==m&&d0>=d))continue;
		if(m>12||m<1)continue;
		if(ifyear(y)==1){
			memcpy(months,months2,sizeof(months));
		}
		else{
			memcpy(months,months1,sizeof(months));
		}
		if(d>months[m-1]||d<1)continue;
		ans1=y*10000+s[0]*1000+s[1]*100+s[2]*10+s[3];
		break;
	}
	cout<<ans1<<endl;
	
	a=n/10000000;
	b=(n/1000000)%10;
	int x=b*10+a;
	int year=a*1010+b*101;
	int flag=1;
	y0=y0+1;
	if(year>y0||(year==y0&&x>m0)||(year==y0&&x==m0&&x>d0))flag=0;
	if(x>12||x<1)flag==1;
	if(ifyear(y)==1){
		memcpy(months,months2,sizeof(months));
	}
	else{
		memcpy(months,months1,sizeof(months));
    }
	if(x>months[x-1]||x<1)flag=1;
	if(flag==0){
		int y=a*1000+b*100+a*10+b;
	    ans2=y*10000+x*100+x;
	}

	
	while(flag){
		if(b==9){
			a++;
			b=0;
		}
		else b++;
		int x=b*10+a;
		if(x>12||x<1)continue;
		int y=a*1000+b*100+a*10+b;
		if(ifyear(y)==1){
			memcpy(months,months2,sizeof(months));
		}
		else{
			memcpy(months,months1,sizeof(months));
		}
		if(x>months[x-1]||x<1)continue;
		ans2=y*10000+x*100+x;
		break;
	}
	cout<<ans2;
	return 0;
} 

可以看下这篇的解答
别人的题解

子串分值

暴力出40分,收工

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	int n=s.size();
	set<char>a;
	int ans=0;
	for(int i=0;i<n;i++){
		for(int j=i;j<n;j++){
			a.clear(); 
			for(int k=i;k<=j;k++){
				a.insert(s[k]);
			}
			ans+=a.size();
		}
	
	}
	cout<<ans;
	return 0;
} 

平面切分

这个程序能过6个例,可以了,每新增一个直线,会增加交点数+1个平面

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	double x,y;
	scanf("%d",&n);
	vector<vector<int> >a(n+1,vector<int>(2));
	for(int i=0;i<n;i++){
		scanf("%d%d",&a[i][0],&a[i][1]);
	}
	int ans=2;
	for(int i=1;i<n;i++){
		pair<double,double>d[1500]={};
		int u=0;
		ans++;
		for(int j=0;j<i;j++){
			if(a[i][0]!=a[j][0]){
				x=(double)(a[j][1]-a[i][1])/(double)(a[i][0]-a[j][0]);
				y=a[i][0]*x+a[i][1];
				d[u++]={x,y};
			}

		}
	    sort(d,d+u);
		ans++;
		for(int k=1;k<u;k++){
			if(fabs(d[k].first-d[k-1].first)<1e-8&&fabs(d[k].second-d[k-1].second)<1e-8)continue;
		    ans++;
		}
	}
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值