4月月赛(基础+普及)个人总结

本蒟蒻共450分(100+70+100+70+100+10)

A题 [202504A]小信买玩具

image题目传送门
点开A题,这题之前好像做过,(100-n%100)%100两次取模即可

核心代码
	cin >> n;
	cout << (100 - n % 100) % 100;
B题 [202504B]平方质和数

image

题目传送门
进入B题,这不是判断数位和是否为质数嘛,赛后才发现是判断数位和是否为质数的函数错了QWQ。。。没开ll

核心代码
bool jugde(ll a) {
	if (a <= 1) return 0;
	for (ll i = 2; i <= sqrt(a); i++)
		if (a % i == 0) return 0;
	return 1;
}
bool check(ll a) {
	ll sum = 0;
	while (a) {
		sum += a % 10;
		a /= 10;
	}
	return jugde(sum);
}
int main() {
	for (ll i = max((int)(pow(l, 0.5) - 1), 4); i * i <= r; i++) {
		if (i * i >= l && i * i <= r) {
			if (check(i * i)) {
				flag = 1, ans *= (i * i) % 998244353, ans %= 998244353;
			}
		}
	}
}
C题 [202504C] 好区间

image
题目传送门
C题就是区间前缀和,很简单

核心代码
	cin >> n >> l >> k;
	for (ll i = 1; i <= n; i++) {
		cin >> a[i];
		a[i] += a[i - 1];
	}
	for (ll i = l; i <= n; i++) {
		if (a[i] - a[i - l] <= k) {
			ans++;
		}
	}
	cout << ans;
D题 [202504D]守护空间站

image
题目传送门
D题数据范围很大,暴力70分不知道怎么优化,赛后看题解知道只需要看最高位即可

核心代码
	cin >> t;
	while (t--) {
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
		}
		ans = 0;
		for (ll j = 29; j >= 0; j--) {
			ll cnt = 0;
			for (ll z = 0; z <= n; z++) {
				if (a[z] >= (1 << j) && a[z] < (1 << (j + 1))) {
					cnt++;
				}
			}
			ans += cnt * (cnt - 1) / 2;
		}
		cout << ans << '\n';
	}
E题 [202504E] 牛马分配

image
题目传送门
E题找出A,B的最大值即可,再判断最大值的坐标即可

核心代码
	freopen("202504E.in", "r", stdin);
	freopen("202504E.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].x >> b[i].x;
		a[i].i = i, b[i].i = i;
	}
	sort(a + 1, a + n + 1, cmp);
	sort(b + 1, b + n + 1, cmp);
	if (a[1].i != b[1].i) {
		cout << max(a[1].x, b[1].x);
	} else {
		cout << min(a[1].x + b[1].x, max(max(a[2].x, b[1].x), max(a[1].x, b[2].x)));
	}
F题 [202504F]小信的元素移动

image
题目传送门
F题不知道while的结束条件,全部输出-1,10分

核心代码
	cin >> t;
	while (t--) {
		cin >> n >> k;
		vector<int> a(n + 1);
		priority_queue<PII, vector<PII>, greater<PII>> h;
		for (int i = 0; i < n; ++i) {
			cin >> a[i];
			if (!a[i]) h.push({0, i});
		}
		int ans = 0;
		while (!h.empty()) {
			auto now = h.top();
			h.pop();
			int cur = (now.second + k) % n;
			if (a[cur] == 0) continue;
			a[cur] = 0;
			h.push({now.first + 1, cur});
			ans = max(ans, now.first + 1);
		}
		bool flag = true;
		for (int i = 0; i < n; ++i) {
			if (a[i]) {
				flag = false;
				break;
			}
		}
		if (flag) {
			cout << ans << endl;
		} else cout << -1 << endl;
	}

赛后总结:

十年OJ一场空,不开ll见祖宗

观看后点赞,养成好习惯 :grinning_face: :grinning_face: :grinning_face:

2 个赞

@cj01 建议不要发 AC 代码

2 个赞

OK,
我改一下

可以用max({x,y,z,...})优化

为什么这么多空格,像AI代码删掉注释