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();
}
相关推荐
流云枫木4 分钟前
C++ STL常用查询手册
开发语言·c++
JUNAI_Strive_ving16 分钟前
力扣6~10题
算法·leetcode·职场和发展
mljy.26 分钟前
C++《string》
c++·学习
洛临_36 分钟前
【C语言】基础篇续
c语言·算法
戊子仲秋37 分钟前
【LeetCode】每日一题 2024_10_7 最低加油次数(堆、贪心)
算法·leetcode·职场和发展
风清扬_jd44 分钟前
Chromium 硬件加速开关c++
java·前端·c++
osir.2 小时前
Tarjan
算法·图论·tarjan
绎岚科技2 小时前
深度学习中的结构化概率模型 - 从图模型中采样篇
人工智能·深度学习·算法·机器学习
福大大架构师每日一题2 小时前
文心一言 VS 讯飞星火 VS chatgpt (364)-- 算法导论24.3 6题
算法·文心一言
7yewh2 小时前
C语言刷题 LeetCode 30天挑战 (八)快慢指针法
linux·c语言·开发语言·数据结构·算法·leetcode·链表