草庐IT

2022年蓝桥杯C/C++B组试题及答案,带详细解析,附带提交网站

Zjkai_ 2024-04-05 原文

题目提交网站

A

答案:1478

B

**文字游戏题,答案自取,不多bibi
不算012,答案为4
算012,,答案为14
算倒序(321),答案为15
算倒序(210),答案为47

C

思路

先算出一周做题量,可以得出周数,剩下的直接暴力判断就行,水题

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	ll a, b, n;
	cin >> a >> b >> n;
	ll week = a * 5 + b * 2, ans = 0;
	ans += n / week * 7;
	n %= week;
	if(n > 5 * a) {
		ans += 5;
		n -= 5 * a;
		if(n > 0) n -= b, ans += 1;
		if(n > 0) n -= b, ans += 1;
	}
	else {
		ans += (n + a - 1) / a;
	}
	cout << ans << '\n';

	return 0;
}

D

思路

不难相出,答案就是当前花的左右距离最大值的二倍。

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	vector<int> ans(n + 1);
	for(int i = 1; i <= n; i++) {
		int l = i - 1;
		int r = n - i;
		ans[i] = max(l, r) * 2;
	}
	for(int i = 1; i <= n; i++) cout << ans[i] << '\n';
	return 0;
}

E


思路

没读懂题,后边补上。。。大家读懂的可以给我评论个题意

F


思路

我赛场上先是写了发 O ( n 4 ) O(n^4) O(n4)的大暴力,后边写完所有题了再回来优化了一下,最终复杂度为 O ( n 3 ) O(n^3) O(n3)

代码

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int maxn = 5e2 + 5;
int a[maxn][maxn];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

	int n, m, k;
	cin >> n >> m >> k;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			cin >> a[i][j];
			a[i][j] += a[i - 1][j];
		}
	}
	ll ans = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = i; j <= n; j++) {
			int tmp = 0, l = 1, r = 0;
			while(r <= m && l <= m) {
				while(r + 1 <= m && tmp + a[j][r + 1] - a[i - 1][r + 1] <= k) {
					r++;
					tmp += a[j][r] - a[i - 1][r];
				}
				ans += r - l + 1;
				tmp -= a[j][l] - a[i - 1][l];
				l++;

			}
		}
	}
	cout << ans << '\n';

	return 0;
}

G


思路

看到所有题目后最先开的这个题,讲一下我思路

首先引入一个题目,用 1 ∗ 2 1*2 12的骨牌填满 2 ∗ n 2*n 2n的方格,问方案数是多少?
f [ i ] f[i] f[i]为长度为 i i i时的方案数,不难得出 f [ 1 ] = 1 , f [ 2 ] = 2 f[1]=1,f[2]=2 f[1]=1,f[2]=2,那么当 i = 3 i=3 i=3的时候状态转移方程是什么样的呢?

  • 我们考虑结尾是一条竖着的骨牌,并且前 i − 1 i-1 i1长度的状态我们已经得出了,所以有 f [ i ] + = f [ i − 1 ] f[i]+=f[i-1] f[i]+=f[i1]
  • 我们考虑结尾是两个横着的骨牌,并且前 i − 2 i-2 i2长度的状态我们已经得出了,所以有 f [ i ] + = f [ i − 2 ] f[i]+=f[i-2] f[i]+=f[i2]
  • 有同学会问,那结尾还可以是两个竖着的呢?我们仔细想,这个状态真的是我们需要的吗?在第一个状态里,结尾为一个竖着的骨牌,并且在 f [ i − 1 ] f[i-1] f[i1]这个状态里也包含了结尾有一个竖着的骨牌的状态,所以我们不需要结尾是两个竖着的骨牌状态。
  • 所以得出, f [ i ] = f [ i − 1 ] + f [ i − 2 ] f[i] = f[i - 1] + f[i - 2] f[i]=f[i1]+f[i2]

那我们把这种想法带入到本题当中,并且考虑结尾的状态

经过分析可以得出状态转移方程
f [ 0 ] = 1 , f [ 1 ] = 1 , f [ 2 ] = 2 , i ≤ 2 f[0]=1,f[1] =1,f[2] =2,i{\leq}2 f[0]=1,f[1]=1,f[2]=2,i2
f [ i ] = f [ i − 1 ] + f [ i − 2 ] + 2 ∗ f [ i − 3 ] + . . . . . + 2 ∗ f [ 0 ] , i ≥ 3 f[i] = f[i - 1] + f[i - 2] + 2 * f[i - 3] + .....+2*f[0],i{\geq}3 f[i]=f[i1]+f[i2]+2f[i3]+.....+2f[0],i3
但是复杂度是 O ( n 2 ) O(n^2) O(n2)的,我们考虑优化
对于转移方程的后面部分,共同带有2倍,我们可以用一个变量代替,并且每次循环的时候加上 f [ i − 3 ] f[i-3] f[i3] 的值就行了,复杂度 O ( n ) O(n) O(n)

代码

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int mod = 1e9 + 7;

int main() {
	int n;
	cin >> n;
	vector<ll> f(n + 1);
	f[0] = 1, f[1] = 1, f[2] = 2;
	ll pre = 0;
	for(int i = 3; i <= n; i++) {
		f[i] = (f[i - 1] + f[i - 2]) % mod;
		pre = (pre + f[i - 3] * 2) % mod;
		f[i] = (f[i] + pre) % mod;
	}
	cout << f[n] << '\n';
	
	return 0;
}

H



思路

  • 注意,给出的爆炸半径都是小于等于10的
  • 一个点处可能有多个炸弹
  • 所以我们设当前点的坐标为 ( x , y ) (x,y) (x,y),我们只需要枚举 ( ( x − 10 , x + 10 ) , ( y − 10 , y + 10 ) ) ((x-10,x+10),(y-10,y+10)) ((x10,x+10),(y10,y+10))这个范围内的点就行了,复杂度由 O ( n 2 ) O(n^2) O(n2)降为 O ( 400 ∗ n ) O(400*n) O(400n),剩下的就是普通BFS了。

代码

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>

using namespace std;

bool cek(pii a, pii b, int r) {
	double dis = 0;
	double x1 = a.first, y1 = a.second;
	double x2 = b.first, y2 = b.second;
	dis = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
	return dis <= r;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	map<pii, int> m1, m2, cnt;
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		int x, y, r;
		cin >> x >> y >> r;
		cnt[pii(x, y)]++;
		m1[pii(x, y)] = max(m1[pii(x, y)], r);
	}
	for(int i = 1; i <= m; i++) {
		int x, y, r;
		cin >> x >> y >> r;
		m2[pii(x, y)] = max(m2[pii(x, y)], r);
	}
	map<pii, int> vis;
	queue<pair<pii, int>> q;
	for(auto it : m2) {
		q.push(it);
		vis[it.first] = 1;
	}
	int ans = 0;
	while(q.size()) {
		pair<pii, int> now = q.front();
		q.pop();
		int x = now.first.first, y = now.first.second, r = now.second;
		for(int i = -10; i <= 10; i++) {
			for(int j = -10; j <= 10; j++) {
				if(i == 0 && j == 0) continue;
				int nx = x + i;
				int ny = y + j;
				if(vis.count(pii(nx, ny)) == 0 && m1.count(pii(nx, ny)) != 0) {
					if(cek(now.first, pii(nx, ny), r)) {
						q.push(pair<pii, int>(pii(nx, ny), m1[pii(nx, ny)]));
						vis[pii(nx, ny)] = 1;
						ans += cnt[pii(nx, ny)];
					}
				}
			}
		}
	}
	cout << ans << '\n';

	return 0;
}

I



思路

  • 全分:记忆化搜索/DP
  • 骗部分分:二进制枚举/ 暴力DFS
    d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]代表当前到第 i i i位,遇到了 j j j次店,还剩 k k k斗酒。

代码

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int maxn = 205;
const int mod = 1e9 + 7;

ll dp[maxn][maxn][maxn];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

	int n, m;
	cin >> n >> m;
	dp[0][0][2] = 1;
	for(int i = 1; i <= n + m; i++) {
		for(int j = 0; j <= n; j++) {
			for(int k = 1; k <= n + m; k++) {
				if(k % 2 == 0) dp[i][j][k] = (dp[i][j][k] + dp[i - 1][j - 1][k >> 1]) % mod;
				dp[i][j][k] = (dp[i][j][k] + dp[i - 1][j][k + 1]) % mod;
			}
		}
	}
	int ans = 0;
	cout << dp[n + m - 1][n][1] << '\n';

    return 0;
}

J



思路

  • 并查集+优先队列
  • 如果 a [ i ] = a [ i − 1 ] a[i]=a[i-1] a[i]=a[i1],那么合并,并且维护当前集合的祖先是当前集合编号最小的编号
  • 每次取最大的,砍掉,直到结束
#include <bits/stdc++.h>
#define ll long long

using namespace std;

ll gao(ll x) {
	return sqrt(x / 2 + 1);
}

struct DSU {
	int n;
	vector<int> fa, rank;
	DSU(int n_ = 0) : n(n_), fa(n_ + 1), rank(n_ + 1) {
		iota(fa.begin(), fa.end(), 0);
	}

	int find(int x) {
		return x == fa[x] ? x : fa[x] = find(fa[x]);
	}

	void merge(int x, int y) {
		x = find(x), y = find(y);
		if(x == y) return ;
		if(y > x) swap(x, y);
		fa[x] = y;
	}
};

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	vector<ll> a(n + 2, -0x3f3f3f3f);
	priority_queue<pair<ll, int>> q;
	DSU dsu(n + 2);
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
		q.push(pair<ll, int>(a[i], i));
	}
	for(int i = 2; i <= n; i++) {
		if(a[i] == a[i - 1]) {
			dsu.merge(i, i - 1);
		}
	}
	ll ans = 0;
	while(q.size()) {
		pair<ll, int> now = q.top();
		q.pop();
		ll x = now.first, id = now.second;
		bool ok = 0;
		if(a[id] == 1) continue;
		if(dsu.find(id) != id) continue;
		if(a[dsu.find(id)] == a[dsu.find(id - 1)]) {
			dsu.merge(id, id - 1); 
			continue;
		}
		a[id] = gao(a[id]);
		ans++;
		if(a[dsu.find(id)] == a[dsu.find(id - 1)]) {
			dsu.merge(id, id - 1); 
			continue;
		}
		q.push(pair<ll, int>(a[id], id));
	}
	cout << ans << '\n';
	return 0;
}

有关2022年蓝桥杯C/C++B组试题及答案,带详细解析,附带提交网站的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby - Ping ruby 网站? - 2

    在Ruby中可以使用哪些替代方法来ping一个ip地址?标准库“ping”库的功能似乎非常有限。我对在这里滚动我自己的代码不感兴趣。有没有好的gem?我应该接受它并忍受它吗?(我在Linux上使用Ruby1.8.6编写代码) 最佳答案 net-ping值得一看。它允许TCPping(如标准ruby​​ping),但也允许UDP、HTTP和ICMPping。ICMPping需要root权限,但其他则不需要。 关于ruby-Pingruby网站?,我们在StackOverflow上找到一个类

  5. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  6. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  7. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  8. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  9. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  10. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

随机推荐