2020.11.07 北师大新生赛(十五)题解

1.P1980 计数问题

  • 这个是签到题,直接从1循环到n就行,统计每一个数字出现 x 出现了多少次。
n,x=map(int,input().split(' '))
count=0
for i in range(1,n+1):
    a,b,c=0,i,i
    while(c>0):
        if x == (c%10):
            count+=1
        c//=10
print(count)

2.CF50A Domino piling

  • 这个题,如果 N ∗ M N * M NM 是偶数的话,那么答案一定是 N ∗ M / 2 N * M / 2 NM/2 的呀,如果是奇数,就是 N ∗ M / 2 − 1 N * M / 2 - 1 NM/21。当然考虑到 C++ 的除法是整除,因此直接输出 N ∗ M / 2 N * M / 2 NM/2 就行,如果是 python的话,输出 N ∗ M / / 2 N * M // 2 NM//2.
#include<iostream>
using namespace std;
int M, N;
int main() {
    
    
	cin >> M >> N;
	cout << M * N / 2 << endl;
	return 0;
}

3.CF749A Bachgold Problem

  • N 是偶数的话,那么就全部分解成2;N 是奇数的话,就分解成一大堆2和一个3.
#include<cstdio>
int main() {
    
    
	int n;
	scanf("%d", &n);
	if (n % 2) {
    
    
		n /= 2;
		printf("%d\n", n);
		for (int i = 0; i + 1 < n; i++) {
    
    
			printf("%d ", 2);
		}
		printf("%d\n", 3);
	}
	else {
    
    
		n /= 2;
		printf("%d\n", n);
		for (int i = 0; i < n; i++) {
    
    
			printf("%d%c", 2, i + 1 == n ? '\n' : ' ');
		}
	}
	return 0;
}

4.CF1189B Number Circle

  • 这个题就是先对数据排一下序,然后从小到大,先摆最小的数字,然后从小到大依次往两边各摆一个数字,就比如有:1,2,3。那么,先摆1;然后摆1,2;然后摆3,1,2
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100005], ans[100005];
int main() {
    
    
	int N;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
    
    
		scanf("%d", &a[i]);
	}
	sort(a, a + N);
	int p1 = 0, p2 = N - 1;
	int i = 0;
	while (i < N) {
    
    
		ans[p1++] = a[i++];
		if (i < N) ans[p2--] = a[i++];
	}
	bool flag = true;
	for (int i = 0; i < N; i++) {
    
    
		if (ans[i] >= ans[(i + N - 1) % N] + ans[(i + 1) % N]) {
    
    
			flag = false;
			break;
		}
	}
	if (flag) {
    
    
		printf("YES\n");
		for (int i = 0; i < N; i++) {
    
    
			printf("%d%c", ans[i], i + 1 == N ? '\n' : ' ');
		}
	}
	else {
    
    
		printf("NO\n");
	}
	return 0;
}

5.CF377A Maze

  • 这是一道很有意思的构造题,假设空地的数量是 cnt 个,需要摆的墙是 K 个,那么,先从一个空地开始走 cnt - K 个空格,然后把剩下的 K 个摆上墙,这样子就可以保证剩下的 cnt - K 个空格是连通的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N, M, K;
const int maxn = 510;
char maze[maxn][maxn];
int dx[] = {
    
    1, -1, 0, 0}, dy[] = {
    
    0, 0, 1, -1};
int cnt, blank;
void dfs(int x, int y){
    
    
	maze[x][y] = '*';
	for(int i = 0; i < 4; i++){
    
    
		int nx = x + dx[i], ny = y + dy[i];
		if(nx < 0 || nx >= N || ny < 0 || ny >= M || maze[nx][ny] != '.') continue;
		if(++blank <= cnt - K) dfs(nx, ny);
	}
}
int main(){
    
    
	scanf("%d%d%d", &N, &M, &K);
	for(int i = 0; i < N; i++){
    
    
		scanf("%s", maze[i]);
	}

	for(int i = 0; i < N; i++){
    
    
		for(int j = 0; j < M; j++){
    
    
			if(maze[i][j] == '.') cnt++;
		}
	}

	bool flag = false;
	for(int i = 0; i < N; i++){
    
    
		for(int j = 0; j < M; j++){
    
    
			if(maze[i][j] == '.' && ++blank <= cnt - K){
    
    
				dfs(i, j);
				flag = true;
				break;
			}
		}
		if(flag) break;
	}


	for(int i = 0; i < N; i++){
    
    
		for(int j = 0; j < M; j++){
    
    
			if(maze[i][j] == '*') maze[i][j] = '.';
			else if(maze[i][j] == '.') maze[i][j] = 'X';
		}
	}
	for(int i = 0; i < N; i++) printf("%s\n", maze[i]);
	return 0;
}

猜你喜欢

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