2020.10.14 北师大新生赛(七)题解

2020.10.14 北师大新生赛(七)题解

P1720 月落乌啼算钱

  • 这个就是算斐波那契数列的第 n 项。
#include<cstdio>
double a[60] = {
    
     0, 1, 1 };
int N;
int main() {
    
    
	scanf("%d", &N);
	for (int i = 3; i <= N; i++) a[i] = a[i - 1] + a[i - 2];
	printf("%.2f\n", a[N]);
	return 0;
}

P1652 圆

  • 只有一个在圆内,一个在圆外,才必须穿过这个圆的边界。
  • 比较两点之间距离的和圆半径的大小时,有时候可以避免使用浮点数。
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 60;
int x[maxn], y[maxn], r[maxn], X1, Y1, X2, Y2;
int N;
bool inCircle(int i, int X, int Y) {
    
    
	return (X - x[i]) * (X - x[i]) + (Y - y[i]) * (Y - y[i]) < r[i] * r[i];
}
int main() {
    
    
	scanf("%d", &N);
	for (int i = 0; i < N; i++) scanf("%d", &x[i]);
	for (int i = 0; i < N; i++) scanf("%d", &y[i]);
	for (int i = 0; i < N; i++) scanf("%d", &r[i]);
	scanf("%d%d%d%d", &X1, &Y1, &X2, &Y2);

	int ans = 0;

	for (int i = 0; i < N; i++) {
    
    
		int a = inCircle(i, X1, Y1), b = inCircle(i, X2, Y2);
		//只有一个在圆内,一个在圆外,才必须穿过这个圆的边界。
		if (a ^ b) ans++;
	}
	printf("%d\n", ans);
	
	return 0;
}

P1223 排队接水

  • 等待时间少的放前面。数学原理可以参考排序不等式(我记得高中数学选修4-5最后一节讲了这个东西)。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int N;
typedef pair<int, int> P;
P a[maxn];
int main() {
    
    
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
    
    
		scanf("%d", &a[i].first);
		a[i].second = i + 1;
	}
	sort(a, a + N);
	double res = 0, ans = 0;
	for (int i = 0; i < N; i++) {
    
    
		printf("%d%c", a[i].second, i + 1 == N ? '\n' : ' ');
		ans += res;
		res += a[i].first;
	}
	printf("%.2f\n", ans / N);
	return 0;
}

UVA572 油田 Oil Deposits

  • 这里展示深度优先搜索的代码。代码还是比较好懂的。
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 110;
int N, M;
char field[maxn][maxn];
void dfs(int x, int y) {
    
    
	field[x][y] = '*';
	for (int dx = -1; dx <= 1; dx++) {
    
    
		for (int dy = -1; dy <= 1; dy++) {
    
    
			int nx = x + dx, ny = y + dy;
			if (nx < 0 || nx >= N || ny < 0 || ny >= M || field[nx][ny] == '*') continue;
			dfs(nx, ny);
		}
	}
}
int main() {
    
    
	while (scanf("%d%d", &N, &M), N && M) {
    
    
		for (int i = 0; i < N; i++) scanf("%s", field[i]);
		int ans = 0;
		for (int i = 0; i < N; i++) {
    
    
			for (int j = 0; j < M; j++) {
    
    
				if (field[i][j] == '@') {
    
    
					ans++;
					dfs(i, j);
				}
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

P5657 格雷码

在这里插入图片描述

#include<cstdio>
typedef unsigned long long ll;
ll N, K;
int main() {
    
    
	scanf("%llu%llu", &N, &K);
	printf("%llu", (K >> (N - 1)) & 1);
	for (int i = N - 2; i >= 0; i--) {
    
    
		printf("%llu", (K >> i & 1) ^ (K >> (i + 1) & 1));
	}
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45812711/article/details/108768851