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();
}
相关推荐
AA陈超6 分钟前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-11 消息小部件
c++·游戏·ue5·游戏引擎·虚幻
再卷也是菜17 分钟前
C++篇(14)二叉树进阶算法题
c++·算法
小邓儿◑.◑21 分钟前
贪心算法 | 每周8题(三)
算法·贪心算法
十五年专注C++开发22 分钟前
QDarkStyleSheet: 一个Qt应用的暗色主题解决方案
开发语言·c++·qt·qss
2401_8414956424 分钟前
【数据结构】最长的最短路径的求解
java·数据结构·c++·python·算法·最短路径·图搜索
小龙报27 分钟前
《算法每日一题(1)--- 连续因子》
c语言·开发语言·c++·windows·git·算法·visual studio
祁同伟.33 分钟前
【C++】异常
开发语言·c++
yuuki23323334 分钟前
【C语言】程序的编译和链接(基础向)
c语言·后端
第七序章1 小时前
【C + +】红黑树:全面剖析与深度学习
c语言·开发语言·数据结构·c++·人工智能
夜晚中的人海1 小时前
【C++】滑动窗口算法习题
开发语言·c++·算法