蓝桥杯第十一届校内模拟赛题解(1)

蓝桥杯第十一届校内模拟赛题解
乱序版
1.长草
问题描述
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。请告诉小明,k 个月后空地上哪些地方有草。
输入格式:
  输入的第一行包含两个整数 n, m。
  接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
  接下来包含一个整数 k。
输出格式
  输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
在这里插入图片描述
思路:迭代

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
char a[1007][1007];
bool vis[1007][1007];
struct node{
	int x;int y;
}; 
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int main(){
	cin>>n>>m;
	queue<node>q;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}
	cin>>k;
	while(k--){
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(a[i][j]=='g') {
					node temp;
					temp.x = i, temp.y = j;
					q.push(temp);
					vis[i][j]=1;
				}
			}
		}
		while(!q.empty()){
			node now=q.front();
			q.pop();
			for(int i=0;i<4;i++){
				int nx=now.x+dx[i];
				int ny=now.y+dy[i];
				if(0<=nx&&nx<n&&0<=ny&&ny<m&&a[nx][ny]=='.'&&!vis[nx][ny]){
					vis[nx][ny]=1;
					a[nx][ny]='g';
				}
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cout<<a[i][j];
		}
		cout<<endl;
	}
}

2.多少个9
问题描述
在1至2019中,有多少个数的数位中包括数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含三个数位9,但在计算时只算做一个数。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int ans = 0;
    for(int i = 1; i <= 2019; i++){
    	int a=i;
    	while(a){
    		if(a% 10 == 9) {
    			ans++;break;
			}
			a/=10;
		}
	}
    cout<<ans<<endl;
    return 0;
}

3.一带一路
问题描述
2015年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。这一次,小明要帮助 n 个村庄通电,其中 1 号村庄正好可以建立一个发电站,所发的电足够所有村庄使用。
现在,这 n 个村庄之间都没有电线相连,小明主要要做的是架设电线连接这些村庄,使得所有村庄都直接或间接的与发电站相通。小明测量了所有村庄的位置(坐标)和高度,如果要连接两个村庄,小明需要花费两个村庄之间的坐标距离加上高度差的平方,形式化描述为坐标为 (x_1, y_1) 高度为 h_ 1 的村庄与坐标为 (x_2, y_2) 高度为 h_ 2 的村庄之间连接的费用为
在这里插入图片描述
由于经费有限,请帮助小明计算他至少要花费多少费用才能使这n个村庄都通电。
输入格式
输入的第一行包含一个整数 n ,表示村庄的数量。
接下来 n 行,每个三个整数 x, y, h,分别表示一个村庄的横、纵坐标和高度,其中第一个村庄可以建立发电站。
输出格式
输出一行,包含一个实数,四舍五入保留 2 位小数,表示答案。
样例输入
4
1 1 3
9 9 7
8 8 6
4 5 4
样例输出
17.41
对于所有评测用例,1 <= n <= 1000,0 <= x, y, h <= 10000。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1007;
const double MAX = 1e9;
struct node {
	double x, y, h;
}a[maxn];
int n;
double c[maxn][maxn], d[maxn], ans;
bool v[maxn];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		double b,c,d;
		cin>>b>>c>>d;
		a[i].x=b;a[i].y=c;a[i].h=d;
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			if(i==j) c[i][j]=0;
			else c[i][j] = MAX;
		}
		d[i] = MAX;
	}
	for(int i=1;i<=n-1;i++){
		for(int j=i+1;j<=n;j++){
			double temp=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y))+(a[i].h-a[j].h)*(a[i].h-a[j].h);
			c[i][j]=c[j][i]=min(c[i][j],temp);
		}
	}
	memset(v, 0, sizeof(v));
    d[1]=0;
	for(int i=1;i<n;i++){
		int x=0;
		for(int j=1;j<=n;j++) if(!v[j] && d[j]<d[x]) x=j;
		v[x]=1;
		for(int y=1;y<=n;y++) if(!v[y]) d[y]=min(d[y],c[x][y]);
	}
	for(int i=2;i<=n;i++) ans+=d[i];
    printf("%.2f", ans);
}

4.二叉树层数
问题描述
一个包含有2019个节点的二叉树,最少有多少层?
注意当一棵二叉树只有一个节点时为一层。
题解
当一棵二叉树为完全二叉树时,其层数最少,为 ⌊log2n⌋+1

#include <bits/stdc++.h>
using namespace std;
int main(){
    int ans = floor( log(2019) / log(2) ) + 1;
    printf("%d", ans);
    return 0;
}

5.数位相同
问题描述
给定正整数 n,请问在整数 1 至 n 中, 数字中没有数位相同的数有多少个?
例如,当 n = 30时,除开 11 和 22 以外,其他的数都没有数位相同,因此答案为28。
样例输入
30
样例输出
28
对于所有评测用例,1 <= n <= 1000000。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int ans = 0;
    for(int i=0;i<=n;i++){
    	int v[10]={0};
    	int a=i;
    	while(a){
    		if(v[a%10]) {
    			ans++;
    			break;
			}
    		v[a%10]=1;
    		a/=10;
		}
	}
    int sum=n-ans;
    cout<<sum<<endl;
    return 0;
}


发布了19 篇原创文章 · 获赞 0 · 访问量 723

猜你喜欢

转载自blog.csdn.net/hahadelaochao/article/details/105572312