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();
}
相关推荐
剑心诀13 小时前
02 数据结构(C) | 线性表——顺序表的基本操作
c语言·开发语言·数据结构
m0_4886333213 小时前
Windows环境下编译运行C语言程序,合适工具与方法很关键
c语言·windows·git·开发工具·编译器
2501_9249526913 小时前
代码生成器优化策略
开发语言·c++·算法
MORE_7713 小时前
leecode100-划分区间-贪心算法
算法·贪心算法
Book思议-14 小时前
【数据结构实战】C语言实现栈的链式存储:从初始化到销毁,手把手教你写可运行代码
数据结构·算法·链表··408
m0_4886333214 小时前
C语言变量命名规则、入门自学、运算符优先级及数据结构介绍
c语言·数据结构·运算符优先级·变量命名·入门自学
Book思议-14 小时前
【数据结构实战】川剧 “扯脸” 与栈的 LIFO 特性 :用 C 语言实现 3 种栈结构
c语言·数据结构·算法·
3GPP仿真实验室14 小时前
【MATLAB源码】感知:CFAR 检测算法库
算法·matlab·目标跟踪
fengenrong14 小时前
20260324
c++·算法
qq_4160187214 小时前
设计模式在C++中的实现
开发语言·c++·算法