部分题目示意图来自网络,所以会带水印

最后编辑时间:

2021年5月12日

统一声明

如果不写默认带有常用头文件

如果不表明主函数默认表示在 void solve(){}

默认使用

using namespace std;

ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using ll = long long;

填空题答案速览

  1. 1040254

1.36进制

对于16进制,我们使用字母A-F来表示10及以上的数字。

如法炮制,一直用到字母Z,就可以表示36进制。

36进制中,A表示10,Z表示35,AA表示370

你能算出 MANY 表示的数字用10进制表示是多少吗?

请提交一个整数,不要填写任何多余的内容(比如,说明文字)

// 1040254
void solve() {
cout << ('M' - 'A' + 10) * 36 * 36 * 36 + 360 * 36 + ('N' - 'A' + 10) * 36 + ('Y' - 'A' + 10);
}

2.磁砖样式

小明家的一面装饰墙原来是 3*10 的小方格。

现在手头有一批刚好能盖住2个小方格的长方形瓷砖。

瓷砖只有两种颜色:黄色和橙色。

小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。

小明有个小小的强迫症:忍受不了任何22的小格子是同一种颜色。

(瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝)

显然,对于 2
3 个小格子来说,口算都可以知道:一共10种贴法,如【p1.png所示】

但对于 3*10 的格子呢?肯定是个不小的数目,请你利用计算机的威力算出该数字。

注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)

const int N = 10;
int n, m;
int g[N][N];
vector<int>v;
set<vector<int>>se;
set<vector<int>>se2;
map<int, int>Hash;
bool check_color() {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
if (i + 1 <= n && j + 1 <= m) {
//1 1 1 1 2 2 2 2 1 2 1 2
if ( (g[i][j] + g[i][j + 1] + g[i + 1][j] + g[i + 1][j + 1]) % 4 == 0)
return false;
}
}
return true;
} bool check2() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == 0) {
return false;
}
}
}
for (int i = 1; i <= n - 1; i++) {
for (int j = 1; j <= m - 1; j++) {
int aa = g[i][j];
int bb = g[i + 1][j];
int cc = g[i][j + 1];
int dd = g[i + 1][j + 1];
if (aa == bb && aa == cc && bb == cc && cc == dd && bb == dd && aa == dd) {
return false;
}
}
}
return true;
} bool check() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == 0) {
return false;
}
}
}
for (int i = 1; i <= n - 1; i++) {
for (int j = 1; j <= m - 1; j++) {
if (g[i][j] == g[i + 1][j] == g[i][j + 1] == g[i + 1][j + 1])
return false;
}
}
return true;
}
void dfs (int x, int y) {
if (x == n + 1 && y == 1) {
if (check_color() ) {
v.clear();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
v.push_back (g[i][j]);
}
}
se.insert (v);
}
if (check2() ) {
v.clear();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
v.push_back (g[i][j]);
}
}
se2.insert (v);
}
return;
}
if (g[x][y]) {
if (y == m)
dfs (x + 1, 1);
else
dfs (x, y + 1);
} else {
if (y + 1 <= m && !g[x][y + 1]) {
for (int i = 1; i <= 2; i++) {
g[x][y + 1] = i;
g[x][y] = i;
if (y == m) {
dfs (x + 1, 1);
} else {
dfs (x, y + 1);
}
g[x][y] = 0;
g[x][y + 1] = 0;
}
}
if (x + 1 <= n && !g[x + 1][y]) {
for (int i = 1; i <= 2; i++) {
g[x + 1][y] = i;
g[x][y] = i;
if (y == m) {
dfs (x + 1, 1);
} else {
dfs (x, y + 1);
}
g[x + 1][y] = 0;
g[x][y] = 0;
}
}
}
}
void solve() {
n = 3, m = 10;
dfs (1, 1);
cout << se2.size() << "\n" << se.size() << "\n";
set<vector<int> >::iterator it = se2.begin();
vector<int> vv;
while (it != se2.end() ) {
if (se2.find (*it) != se2.end() && se.find (*it) == se.end() ) {
vv = *it;
break;
}
it++;
}
int t = 0;
for (int i = 0; i < vv.size(); i++) {
if (t == 10) {
t = 0;
cout << endl;
}
cout << vv[i] << " ";
t++;
}
cout << endl;
}

3.希尔伯特曲线

希尔伯特曲线是以下一系列分形曲线 Hn 的极限。我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和右下角终点),恰好覆盖每个方格一次。

Hn(n > 1)可以通过如下方法构造:

  1. 将 Hn-1 顺时针旋转90度放在左下角
  2. 将 Hn-1 逆时针旋转90度放在右下角
  3. 将2个 Hn-1 分别放在左上角和右上角
  4. 用3条单位线段把4部分连接起来

对于 Hn 上每一个顶点 p ,我们定义 p 的坐标是它覆盖的小方格在矩阵中的坐标(左下角是(1, 1),右上角是(2^n, 2^n),从左到右是X轴正方向,从下到上是Y轴正方向),

定义 p 的序号是它在曲线上从起点开始数第几个顶点(从1开始计数)。

以下程序对于给定的n(n <= 30)和p点坐标(x, y),输出p点的序号。请仔细阅读分析源码,填写划线部分缺失的内容。

#include <stdio.h>

long long f(int n, int x, int y) {
if (n == 0) return 1;
int m = 1 << (n - 1);
if (x <= m && y <= m) {
return f(n - 1, y, x);
}
if (x > m && y <= m) {
return 3LL * m * m + f(n - 1, ________________ , m * 2 - x + 1); // 填空
}
if (x <= m && y > m) {
return 1LL * m * m + f(n - 1, x, y - m);
}
if (x > m && y > m) {
return 2LL * m * m + f(n - 1, x - m, y - m);
}
} int main() {
int n, x, y;
scanf("%d %d %d", &n, &x, &y);
printf("%lld", f(n, x, y)); return 0;
}

注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

4.发现环

小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。

不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。

为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?

输入

第一行包含一个整数N。

以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连。

对于30%的数据,1 <= N <= 1000

对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N

输入保证合法。

输出

按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。

样例输入:

5
1 2
3 1
2 4
2 5
5 3

样例输出:

1 2 3 5

const int N = 1e5  + 10;
vector<int>e[N];
int d[N];
void solve() {
int n;
cin >> n;
for (int i = 0, a, b; i < n; ++i) {
cin >> a >> b;
e[a].push_back (b);
e[b].push_back (a);
d[a]++, d[b]++;
}
for (int i = 1; i <= n; ++i) {
if (d[i] == 1) {
int tmp = i;
while (d[tmp] == 1) {
int tmpp = e[tmp][0];
d[tmpp]--;
tmp = tmpp;
}
}
}
for (int i = 1; i <= n; ++i)
if (d[i] > 1) cout << i << " ";
cout << "\n";
}

5.对局匹配

小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。

小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。

现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, ... AN。

小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)?

输入

第一行包含两个个整数N和K。

第二行包含N个整数A1, A2, ... AN。

对于30%的数据,1 <= N <= 10

对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000

输出

一个整数,代表答案。

样例输入:

10 0

1 4 2 8 5 7 1 4 2 8

样例输出:

6

再比如,

样例输入:

10 1

2 1 1 1 1 4 4 3 4 4

样例输出:

8

using ll = long long;
const int N = 1e5 + 10;
int cnt[N], val[N], f[N];
int n, k;
void solve() {
cin >> n >> k;
for (int i = 1, x; i <= n; ++i) cin >> x, cnt[x]++;
int ans = 0;
if (k == 0) { // 特判 k = 0
for (int i = 1; i <= n; ++i) if (cnt[i]) ans++;
cout << ans << "\n";
return;
}
for (int i = 0; i < k; ++i) {
int m = 0;
for (int j = i; j <= N - 10; j += k) val[m++] = cnt[j];
f[0] = val[0];
for (int j = 1; j < m; ++j) {
if (j == 1) f[j] = max (f[0], val[j]);
else f[j] = max (f[j - 2] + val[j], f[j - 1]);
}
ans += f[m - 1];
}
cout << ans << "\n";
}

6.观光铁路

跳蚤国正在大力发展旅游业,每个城市都被打造成了旅游景点。

许多跳蚤想去其他城市旅游,但是由于跳得比较慢,它们的愿望难以实现。这时,小C听说有一种叫做火车的交通工具,在铁路上跑得很快,便抓住了商机,创立了一家铁路公司,向跳蚤国王请示在每两个城市之间都修建铁路。

然而,由于小C不会扳道岔,火车到一个城市以后只能保证不原路返回,而会随机等概率地驶向与这个城市有铁路连接的另外一个城市。

跳蚤国王向广大居民征求意见,结果跳蚤们不太满意,因为这样修建铁路以后有可能只游览了3个城市(含出发的城市)以后就回来了,它们希望能多游览几个城市。于是跳蚤国王要求小C提供一个方案,使得每只跳蚤坐上火车后能多游览几个城市才回来。

小C提供了一种方案给跳蚤国王。跳蚤国王想知道这个方案中每个城市的居民旅游的期望时间(设火车经过每段铁路的时间都为1),请你来帮跳蚤国王。

【输入格式】

输入的第一行包含两个正整数n、m,其中n表示城市的数量,m表示方案中的铁路条数。

接下来m行,每行包含两个正整数u、v,表示方案中城市u和城市v之间有一条铁路。

保证方案中无重边无自环,每两个城市之间都能经过铁路直接或间接到达,且火车由任意一条铁路到任意一个城市以后一定有路可走。

【输出格式】

输出n行,第i行包含一个实数ti,表示方案中城市i的居民旅游的期望时间。你应当输出足够多的小数位数,以保证输出的值和真实值之间的绝对或相对误差不超过1e-9。

【样例输入】

4 5

1 2

2 3

3 4

4 1

1 3

【样例输出】

3.333333333333

5.000000000000

3.333333333333

5.000000000000

【样例输入】

10 15

1 2

1 9

1 5

2 3

2 7

3 4

3 10

4 5

4 8

5 6

6 7

6 10

7 8

8 9

9 10

【样例输出】

10.000000000000

10.000000000000

10.000000000000

10.000000000000

10.000000000000

10.000000000000

10.000000000000

10.000000000000

10.000000000000

10.000000000000

【数据规模与约定】

对于10%的测试点,n <= 10;

对于20%的测试点,n <= 12;

对于50%的测试点,n <= 16;

对于70%的测试点,n <= 19;

对于100%的测试点,4 <= k <= n <= 21,1 <= u, v <= n。数据有梯度。

限时2秒

2017年第八届 蓝桥杯B组C/C++决赛题目的更多相关文章

  1. 2017年蓝桥杯B组C/C++决赛题目

    2017年第八届蓝桥杯B组C/C++决赛题目 点击查看2017年蓝桥杯B组C/C++决赛题解     1.36进制 对于16进制,我们使用字母A-F来表示10及以上的数字. 如法炮制,一直用到字母Z, ...

  2. 2018年蓝桥杯A组C/C++决赛题目

    2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解     1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...

  3. 2016年蓝桥杯B组C/C++决赛题目

    2016年第七届蓝桥杯B组C/C++决赛题目 点击查看2016年第七届蓝桥杯B组C/C++决赛题解 1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...

  4. 2018年蓝桥杯B组C/C++决赛题目

    自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解     1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...

  5. 2015年蓝桥杯B组C/C++决赛题目

    2015年第六届蓝桥杯B组C/C++国赛题目 点击查看2015年第六届蓝桥杯B组C/C++国赛题解     1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会 ...

  6. 2017年蓝桥杯B组C/C++决赛题解

    2017年蓝桥杯B组C/C++决赛题目(不含答案) 1.36进制 ok 求36进制,类比二进制转10进制,36^3 + 36^2 + 36^1 + 36^0 2.磁砖样式 ok dfs搜索 我自己写的 ...

  7. 2018年蓝桥杯A组C/C++决赛题解

    2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...

  8. 2016年蓝桥杯B组C/C++决赛题解

    2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...

  9. 2018年蓝桥杯B组C/C++决赛题解

    2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...

  10. 2015年蓝桥杯B组C/C++决赛题解

    2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案)     1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...

随机推荐

  1. [AI]重新审视“幻肢”现象背后的意识机制

    "幻肢"实验 "幻肢"实验是研究幻肢现象的经典实验方法.实验对象通常选择已经失去一肢如手或脚的病人.实验主要步骤是:首先安装一台镜头对残肢部位进行实时视频监测. ...

  2. 深度解剖Linux权限的概念

    Linux 权限系统是其安全性的基石,它允许系统管理员和用户对文件和目录进行精细的控制.在深度解剖 Linux 权限的概念时,我们需要涵盖以下主题: 1. **文件系统基础** - 文件系统结构:Li ...

  3. [gym104542F] Interesting String Problem

    Since you are a good friend of Jaber and Eyad, they are asking for your help to solve this problem. ...

  4. 【Linux API 揭秘】container_of函数详解

    [Linux API 揭秘]container_of函数详解 Linux Version:6.6 Author:Donge Github:linux-api-insides 1.container_o ...

  5. Mybatis|MybatisPlus批量插入

    创建一个SpringBoot工程 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  6. Python给exe添加以管理员运行的属性

    需求 有些应用每次启动都需要用管理员权限运行,比如Python注入dll时,编辑器或cmd就需要以管理员权限运行,不然注入就会失败. 这篇文章用编程怎么修改配置实现打开某个软件都是使用管理员运行,就不 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (160)-- 算法导论12.4 2题

    二.用go语言,请描述这样一棵有 n 个结点的二叉搜索树,其树中结点的平均深度为 O(lgn),但这棵树的高度是w(lgn).一棵有 n个结点的二叉搜索树中结点的平均深度为 O(lgn),给出这棵树高 ...

  8. 使用dtd定义元素

  9. PySimpleGUI 使用浅谈

    1. 背景 PySimpleGUI是一个简单易用的Python GUI库,它提供了一种直观且快速创建图形用户界面的方式. 2. 安装 pip install PySimpleGUI 3. PySimp ...

  10. Spring MVC 源码解析

    本文的 MVC 基于传统的 Servlet 应用,所使用的 Spring Web 的环境为 Spring Boot 2.5.2 静态资源的加载 参考 Spring Boot 中给出的文档,原文如下: ...