Codeforces Round 924 - A、B、C

文章目录

  • [A. Rectangle Cutting](#A. Rectangle Cutting)
  • [B. Equalize](#B. Equalize)
  • [C. Physical Education Lesson](#C. Physical Education Lesson)

A. Rectangle Cutting

观察拼接规律,只能从中间切割,考虑边长单双数和切割后是否等于另一条边

C++ 复制代码
#include<bits/stdc++.h>

using namespace std;

void solve()
{
	int n,m;
	cin >> n >> m;
	int flag = 0;
	if(n % 2 == 0 && n / 2 != m) flag = 1;
	else if(m % 2 == 0 && m / 2 != n) flag = 1;
	
	if(flag) cout << "Yes" << endl;
	else cout << "No" << endl;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T;
	cin >> T;
	while(T--) solve();
}

B. Equalize

在一个长度为元素个数的区间里即可,可以双指针思路简化时间复杂度(前几次提交未用双指针,直接使用std::distance都tle了)

C++ 复制代码
#include<bits/stdc++.h>

using namespace std;

void solve()
{
	set<int> st;
	int n;
	cin >> n;
	int sum = n;
	while(n--)
	{
		int m;
		cin >> m;
		st.insert(m);
	}
	vector<int> vct;
	for(auto &x : st) vct.push_back(x);
	int ans = 1;
	auto x = vct[0];
	for(int i = 1; i < vct.size() && vct[i] <= vct[0] + sum - 1; i ++ ) ans ++;
	int i = 0, j = ans - 1;
	for(i = 1; i < vct.size(); i ++ )
	{
		for(;vct[j] <= vct[i] + sum -1 && j < vct.size(); j ++ ) ;
		j = j - 1;
		ans = max(ans, j - i + 1);
	}
	cout << ans << endl;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T;
	cin >> T;
	while(T--) solve();
}

C. Physical Education Lesson

上坡位置:n-x是2k-2的倍数;下坡位置:n+x-2是2k-2的倍数。遍历所有k,再看k是否满足该位是x

C++ 复制代码
#include<bits/stdc++.h>

using namespace std;

void solve()
{
	int n, x;
	cin >> n >> x;
	set<int> s;
	// 在上坡
	{
		auto check = [&](int y){
			if (y % 2 == 1) return;
			int k = (y + 2) / 2;
			if (k != 1) s.insert(k);
		};
		
		int r = n - x;
		for(int i = 1; i * i <= r; i++){
			check(i);
			if (i * i != r) check(r / i);
		}
	}
	// 在下坡
	{
		auto check = [&](int y){
			if (y % 2 == 1) return;
			int k = (y + 2) / 2;
			if (k != 1) s.insert(k);
		};
		
		int r = n + x - 2;
		for(int i = 1; i * i <= r; i++){
			check(i);
			if (i * i != r) check(r / i);
		}
	}
	int ans = 0;
	for(auto y : s){
		int r = n % (2 * y - 2);
		if (r == 0) r += 2 * y - 2;
		int t = 0;
		if (r <= y) t = r;
		else t = 2 * y - 2 - r + 2;
		if (t == x) ans += 1;
	}
	cout << ans << '\n';
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T;
	cin >> T;
	while(T--) solve();
}
相关推荐
练习时长一年1 分钟前
Leetcode热题100(跳跃游戏 II)
算法·leetcode·游戏
小白菜又菜5 小时前
Leetcode 3432. Count Partitions with Even Sum Difference
算法·leetcode
wuhen_n7 小时前
LeetCode -- 15. 三数之和(中等)
前端·javascript·算法·leetcode
sin_hielo7 小时前
leetcode 2483
数据结构·算法·leetcode
sevenez7 小时前
Vibe Coding 实战笔记:从“修好了C坏了AB”到企业级数据库架构重构
c语言·笔记·数据库架构
Xの哲學7 小时前
Linux多级时间轮:高精度定时器的艺术与科学
linux·服务器·网络·算法·边缘计算
大头流矢8 小时前
归并排序与计数排序详解
数据结构·算法·排序算法
阿闽ooo8 小时前
外观模式:从家庭电源控制看“简化接口“的设计智慧
c++·设计模式·外观模式
油泼辣子多加8 小时前
【信创】算法开发适配
人工智能·深度学习·算法·机器学习
一路往蓝-Anbo8 小时前
【第20期】延时的艺术:HAL_Delay vs vTaskDelay
c语言·数据结构·stm32·单片机·嵌入式硬件