Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】

这篇具有很好参考价值的文章主要介绍了Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


传送门

A. Love Story(模拟)

题意:比较字符串

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 105;
string o = "codeforces";
void solve() {
	string s;
	cin >> s;
	int cnt = 0;
	for (int i = 0; i < 10; i++) if (s[i] != o[i]) cnt++;
	cout << cnt << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

B. Blank Space(模拟)

题意:求出最长连续的0,典中典

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 105;
int a[N];
void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	int cnt = 0, ans = 0;
	for (int i = 1; i <= n; i++) {
		if (!a[i]) cnt++;
		else ans = max(cnt, ans), cnt = 0;
	}
	ans = max(cnt, ans);//注意这个
	cout << ans << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

C. Mr. Perfectly Fine(模拟)

题意:给出花费和01串,让你找到,这些串异或和为11的最小花费。
思路:00是无用书,只需求出01 10 11的最小花费,如果没有11而且,01 10缺一个就是做不到,其余两种求最小即可。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 105;
void solve() {
	int a = inf, b = inf, c = inf;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		string s;
		cin >> s;
		if (s == "00") continue;
		if (s == "10") a = min(a, x);
		if (s == "01") b = min(b, x);
		if (s == "11") c = min(c, x);
	}
	if (c == inf && (a == inf || b == inf)) {
		cout << -1 << '\n';
		return;
	} 
	cout << min(a + b, c) << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

D. Gold Rush(小思维)

题意:给你两个整数m,n,你每次可以把一个数拆成两份,大份的恰好是小份两倍,你可以在产生的新的数继续这样操作,问你是否能够从m中拆出n。
思路:我们可以知道 n/m= 1/3 * 2/3.。。。的乘积,因为每次都是取大份,或者取小份。化简分式后,统计分母是不是只有3,分子是不是只有2,而且2的数目小于3的数目即可。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 105;
void solve() {
	int n, m;
	cin >> n >> m;
	int gcd = __gcd(n, m);
	n /= gcd, m /= gcd;
	int cnt1 = 0, cnt2 = 0;
	while (n % 3 == 0) n /= 3, cnt1++;
	while (m % 2 == 0) m /= 2, cnt2++;
	if (n == 1 && m == 1 && cnt1 >= cnt2) {
		cout << "YES\n";
	} else cout << "NO\n";
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

E. The Lakes(DFS)

题意:给你一个非负矩阵,让你求出最大的正数联通块的权值和。
思路:标准的DFS,思路一定要清晰,主要起始点能否开始,出发出的标记一定要打好。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 1005;
int mp[N][N], vis[N][N], n, m;
int cnt, go[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//方向数组
void dfs(int x, int y) {
	for (int i = 0; i < 4; i++) {
		int nx = x + go[i][0], ny = y + go[i][1];
		if (nx < 1 || nx > n || ny < 1 || ny > m || vis[nx][ny] || !mp[nx][ny]) continue;//顺序有讲究,先看越界。如果有标记,或者是0的话无法搜索。
		vis[nx][ny] = 1;
		cnt += mp[nx][ny];//统计一下
		dfs(nx, ny);
	}
}
void solve() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> mp[i][j];
			vis[i][j] = 0;
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (vis[i][j] || !mp[i][j]) continue;//如果是0或者是有标记的正数
			cnt = mp[i][j];
			vis[i][j] = 1;//别忘记!!!不然会寄
			dfs(i, j);
			ans = max(ans, cnt);
		}
	}
	cout << ans << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

F. Forever Winter(简单的图)

题意:给你一个雪花图的联通关系,让你判断雪花的第一分支数和第二分支数。
思路:本题并不需要什么高深的东西,只需要统计一下每个点的度数即可。首先,如果说这里有三种度数,1 1 1 x x x x y 那么唯一的y度数必定是第一分支数,多个x必定是第二分支数(注意这里xy均大于1),1是叶子,无妨。如果说这里是两种度数的话 1 1 1 x x x那么第一分支数就是x 的数目 -1,第二分支数x - 1.

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 105;
int in[N];
void solve() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) in[i] = 0;
	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;
		in[u]++;
		in[v]++; 
	}
	map<int, int> mp;
	for (int i = 1; i <= n; i++) {
		mp[in[i]]++;
	}
	int x = -1, y;
	for (auto i : mp) {
		if (i.second == 1) x = i.first;//唯一的度数是第一分支数
		if (i.first != 1 && i.second != 1) y = i.first - 1;//度数 - 1(来自中心的一度)
	}
	if (x == -1) x = y + 1;//恢复原来的度数
	cout << x << ' ' << y << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

G. Hits Different(二维前缀和)

题意:求出矩阵的和。
思路:
Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】

我借用了一下官方题解的图,红色的箭头是我遍历的方向。i枚举是第几斜层,j体现坐标变化。
二维前缀和比较简单。
Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】
俩红减去蓝色,加上新的数。
还有一个要注意的点是,这个是1 + 2 + 3 + 4 … 1000是不够的,还有就是小心RE,ans+5是不够的。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 2e6 + 5;
ll ans[N], sum[1455][1455];
void init() {
	ll cur = 1;
	for (int i = 1; i <= 1450; i++) {
		for (int j = 0; j < i; j++) {
			sum[i - j][j + 1] = sum[i - j - 1][j + 1] + sum[i - j][j] - sum[i - j - 1][j] + cur * cur;
			ans[cur++] = sum[i - j][j + 1];
		}
	}
//	cout << cur << '\n';
}
void solve() {
	int n;
	cin >> n;
	cout << ans[n] << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	init();
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

H. Don’t Blame Me(状态压缩dp)

题意:给你一个数组,让你求出所有元素按位与和的值的1的数目是k的方法数
思路:定义dp状态,表示在前i个数,子序列元素按位与和的值为j的方法数。
对于i的所有j的值的方法数,来源有三种,一种是前i - 1内部的方法数的贡献,一种是第i个数单独的贡献,一种是前i-1数和第i个数相互作用的贡献。__builtin_popcount()统计二进制数中1的数目。文章来源地址https://www.toymoban.com/news/detail-437508.html

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 2e5 + 5, mod = 1e9 + 7;
ll f[N][70];
void solve() {
	int n, k;
	cin >> n >> k;
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j < 64; j++) {
			f[i][j] = 0;
		}
	}
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		for (int j = 0; j < 64; j++) {
			f[i][j] = (f[i][j] + f[i - 1][j]) % mod;
			f[i][j & x] = (f[i][j & x] + f[i][j]) % mod;
		}
		f[i][x] = (f[i][x] + 1) % mod;
	}
	ll ans = 0;
	for (int i = 0; i < 64; i++) {
		if (__builtin_popcount(i) == k) ans = (ans + f[n][i]) % mod;
	}
	cout << ans << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

到了这里,关于Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Codeforces Round 920 (Div. 3)

    Codeforces Round 920 (Div. 3) 题意:随机给出正方形在平面坐标系上的四个顶点的坐标,求正方形的面积,正方形边与xy轴平行。 思路:因为正方形与坐标轴平行,所以找出相同的两x或y坐标即可找到一条边的长度,平方就是面积,注意结果返回整型。 AC code: 题意:给出两个01字符

    2024年01月17日
    浏览(68)
  • Codeforces Round 912 (Div. 2)

    大等于2依据冒泡排序即可排序,因此判断下1即可 对每一个数字找哪一位肯定为0填0其他的填1 从后往前考虑加到当前集合或新立一个集合 从最高位开始考虑能否为1,计算能否时每个数当前位为1

    2024年02月04日
    浏览(45)
  • Codeforces Round 881 (Div. 3)

    给定一个数组,给每个元素涂色。求最大的代价。 代价为每个颜色的代价和。 每个颜色的代价为涂了该颜色的元素的极差。 因为是极差,每个元素要么对答案有正的贡献,要么有负的贡献,要么无贡献。且正负贡献的个数要相同。 因为要最大值,自然就是想有正贡献的是最

    2024年02月09日
    浏览(44)
  • Codeforces Round 867 (Div. 3)

    从所有a[i]+i-1=t的选择种取个max即可 实际上就是取同符号乘积的最大值 找规律,发现结果与边长n的关系是:res = n * (n + 3) - (n - 2) ①当n为奇数时,除了1其他均无解 ②当n为偶数时,我们可以构造一个形如n,1,n - 2,3,...的数列 首先我们可以发现n必定出现在起始位置。如果n不在起

    2024年02月02日
    浏览(49)
  • Codeforces Round 874 (Div. 3)

    用最少的长度为2的字符串按一定规则拼出s。规则是:前一个字符串的尾与后一个字符串的首相同。 统计s中长度为2的不同字符串数量。 给定数组a[n]和b[n],重排b后,令任意|ai−bi|≤k成立(1≤k≤n)数据保证一定有解。 将a和b分别按从小到大的顺序匹配便是最优的,一定能满足

    2024年02月05日
    浏览(38)
  • Codeforces Round 894 (Div. 3)

    签到题 a数组里,大于等于前一个值的a[i]会被写到b里。直接遍历b,如果b[i]比前一个小就在它前面插一个相等的值 计算反过来的长度,判断是否相等就行 对于没有重复口味的集合,能选出的方案是n*(n-1)/2 (从n个里面选2个的组合数)。二分找出需要多少不同口味的冰淇淋,

    2024年02月11日
    浏览(45)
  • Codeforces Round 926 (Div. 2)

    类似于倍投法,就是在一赔一的情况下,第一次压一块钱,每输一次就押注上一次两倍的金额. 假如资金无限的话,这种方法赢的期望为无穷大.原理类似于二进制,不论你输再多次,只要赢一次总额就增加了1.比如 15 二进制1111,前3把一直输,但是只要第4把赢,就一定可以增加 1

    2024年02月20日
    浏览(45)
  • Codeforces Round 868 Div 2

    要求构造一个仅包含 (1) 和 (-1) 的长度为 (n) 的数组 (a) ,使得存在 (k) 个下标对 ((i, j), i j) 满足 (a_i times a_j = 1) 。 当有 (x) 个 (1) , (y) 个 (-1) 时,其满足条件的下标对数量为 (frac{x (x - 1)}{2} + frac{y (y - 1)}{2}) 。 由于 (n) 只有 (100) ,直接枚举 (x) 即可。

    2024年02月01日
    浏览(45)
  • Codeforces Round 866 (Div. 2)

    给出一个仅由_或^组成的字符串,你可以在任意位置添加_或^字符,使得字符串满足: 任意字符要么属于^_^的一部分,要么属于^^的一部分。求最少添加的字符数量。 对于_我们只需处理没有组成^_^的_: ①如果_在首位置且左边没有^则添加^ ②如果_在尾位置且右边没有^则添加

    2023年04月25日
    浏览(57)
  • Codeforces Round 918 (Div. 4)补题

    Odd One Out(Problem - A - Codeforces) 题目大意:有三个数,其中两个相同,找出不同的那个数。 Not Quite Latin Square(Problem - B - Codeforces) 题目大意:有一个3*3的矩阵,每行每列都由1,2,3三个元素构成,且同行同列中的元素不同,先有一个地方出现空缺,要求输出空缺位置的元素

    2024年02月01日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包