第九届蓝桥杯题解

1 .分数

用等差数列求和公式算出来再模拟

#include<bits/stdc++.h>
using namespace std;
int main(){
	int len=1;
	int sum=1;
	for(int i=1;i<20;i++){
		len*=2;
		sum+=len;
	}
	printf("%d/%d",sum,len);
}

2.星期一

可以查询日期,也可以通过当前日期推算

#include<bits/stdc++.h>
using namespace std;//2001年一月一日星期一 
int main(){
	cout<<(365*100+25)/7;
}

3.第几个幸运数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=59084709587505;
int main(){
	int a[3]={3,5,7};
	ll t=1;
	set<ll>s;
	while(1){
		for(int i=0;i<3;i++){
			ll tt=t*a[i];
			if(tt<=maxn){
				s.insert(tt);
			}
		}
		t=*(s.upper_bound(t));
		if(t>=maxn) break;
	}
	cout<<s.size()<<endl;
}

4.航班时间

#include<bits/stdc++.h>
using namespace std;
int gettime(){
	char s[30];
	cin.getline(s,30);
	int h1,m1,s1,h2,m2,s2,d=0;
	if(strlen(s)<=17){
	sscanf(s,"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
	}
	else{
		sscanf(s,"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
	}
	return d*24*3600+h2*3600+m2*60+s2-(h1*3600+m1*60+s1);
}
int main(){
	int n;
	cin>>n;
	getchar();
	for(int i=0;i<n;i++){
		int  time1=gettime();
		int  time2=gettime();
		int t=(time1+time2)/2;
		int h=t/3600;
		int m=t%3600/60;
		int s=t%60;
		printf("%02d:%02d:%02d\n",h,m,s);
	}
}

5.全球变暖

连通块加深搜,然后用一个数组记录周围有没有海洋,如果没有就记录.

#include<bits/stdc++.h>
using namespace std;
char a[2000][2000];
int visit[2000][2000];
int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int ans[20000];
int cnt2;
int cnt1=0;
int n;
void dfs(int x,int y){
	if(x>=n||x<0||y>=n||y<0) return;
	int flag=1;
	for(int i=0;i<4;i++){
		int dx=x+dir[i][0];
		int dy=y+dir[i][1];
		if(a[dx][dy]=='.'){
			flag=0;
		}
	}
	if(a[x][y]=='#'&&flag) ans[cnt1]++;
	for(int i=0;i<4;i++){
		int dx=x+dir[i][0];
		int dy=y+dir[i][1];
		if(dx>=0&&dx<n&&dy>=0&&dy<n&&!visit[dx][dy]){
			if(a[dx][dy]=='#'){
			visit[dx][dy]=1;
			dfs(dx,dy);	
			}
			else if(a[dx][dy]=='.'){
				a[x][y]='@';
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(a[i][j]=='#'&&!visit[i][j]){
				cnt1++;
				visit[i][j]=1;
				dfs(i,j);
				if(ans[cnt1]) cnt2++;
			}
		}
	}
	cout<<cnt1-cnt2<<endl;
}

6.倍数问题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>v[2000000];
bool cmp(ll a,ll b){
	return a>b;
}
int main(){
	ll n,k,t,sum,maxn=0;
	cin>>n>>k;
	for(ll i=0;i<n;i++){
		cin>>t;
		v[t%k].push_back(t);
	}
	for(ll i=0;i<k;i++){
		sort(v[i].begin(),v[i].end(),cmp);
	}
	for(ll i=0;i<k;i++){
		for( ll j=0;j<k;j++){
			t=(k-(i+j)%k)%k;
			sum=0;
			if(v[i].size()&&v[j].size()&&v[t].size()){
				if(j!=i&&i!=t&&t!=j){
					sum=v[i][0]+v[j][0]+v[t][0];		
				}
				else if(j==i&&i!=t){
					if(v[i].size()==1)continue;
					sum=v[i][0]+v[i][1]+v[t][0];
				}
				else if(j==t&&i!=t){
					if(v[j].size()==1)continue;
					sum=v[j][0]+v[j][1]+v[i][0];
				}
				else if(i==t&&j!=t){
					if(v[i].size()==1)continue;
					sum=v[i][0]+v[i][1]+v[j][0];
				}
				else {
					if(v[i].size()<=2)continue;
					sum=v[i][0]+v[i][1]+v[i][2];
				}
			}
			if(sum>maxn)maxn=sum;
		}
		}
		cout<<maxn<<endl;
	}

7.乘积尾0

计算这些数共有多少因子2和因子5,然后取最小

#include<bits/stdc++.h>
using namespace std;
int main(){
	int sum2=0;
	int sum5=0;
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			int a;
			cin>>a;
			while(a%5==0){
				a/=5;
				sum5++;
			}
			while(a%2==0){
				a/=2;
				sum2++;
			}
		}
	}
	cout<<min(sum2,sum5); 
}

打印图形

其实这个我没太看懂,不过观察draw函数发现肯定要用那个size,然后把n改成2,试试size/1,size/2,size/3看那个和样例一样就可以了(抱歉我是菜鸟)

#include <stdio.h>
#include <stdlib.h>
void show(char* buf, int w){
	int i,j;
	for(i=0; i<w; i++){
		for(j=0; j<w; j++){
			printf("%c", buf[i*w+j]==0? ' ' : 'o');
		}
		printf("\n");
	}
}
 
void draw(char* buf, int w, int x, int y, int size){
	if(size==1){
		buf[y*w+x] = 1;
		return;
	}
 
	int n =size/3; //填空
	draw(buf, w, x, y, n);
	draw(buf, w, x-n, y ,n);
	draw(buf, w, x+n, y ,n);
	draw(buf, w, x, y-n ,n);
	draw(buf, w, x, y+n ,n);
}
 
int main()
{
	int N = 3;
	int t = 1;
	int i;
	for(i=0; i<N; i++) t *= 3;
 
	char* buf = (char*)malloc(t*t);
	for(i=0; i<t*t; i++) buf[i] = 0;
 
	draw(buf, t, t/2, t/2, t);
	show(buf, t);
	free(buf);
 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值