【CF比赛记录】 —— Codeforces Round 920 (Div. 3)(A、B、C、D)

🌏博客主页:PH_modest的博客主页
🚩当前专栏:CF比赛记录
💌其他专栏:
🔴每日一题
🟡 cf闯关练习
🟢 C语言跬步积累
🌈座右铭:广积粮,缓称王!

A. Square

👉传送门👈
在这里插入图片描述

1.Tutorial

直接暴力每个点直接的距离,然后排个序,排序后的结果为:宽、宽、长、长、斜边、斜边,第一个和第三个就是宽和长,因为一个点和另外几个点组成的边分为三种:宽、长、斜边。根据斜边大于宽和长就可以得到前面的结论。

2.Solution

//https://codeforces.com/contest/1921/problem/A
//
//
#include<bits/stdc++.h>
#define int long long
using namespace std;

int f(int x,int y)
{
	return sqrt(x*x+y*y);
}

void solve()
{
	int s[8];
	int a,aa,b,bb,c,cc,d,dd;
	cin>>a>>aa>>b>>bb>>c>>cc>>d>>dd;
	s[0]=f(abs(a-b),abs(aa-bb));
	s[1]=f(abs(a-c),abs(aa-cc));
	s[2]=f(abs(a-d),abs(aa-dd));
	s[3]=f(abs(b-c),abs(bb-cc));
	s[4]=f(abs(b-d),abs(bb-dd));
	s[5]=f(abs(c-d),abs(cc-dd));
	sort(s,s+6);
	int x=s[0],y=s[2];
	cout<<x*y<<"\n";
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

3.Conclusion

这边不建议使用hypot来求斜边(我一开始用了之后结果会出错,浪费了我好长时间


B. Arranging Cats

👉传送门👈
在这里插入图片描述

1.Tutorial

  • 结论:分别记录操作一和操作二的次数,最大的就是结果。
  • 推导:分别统计需要放入猫的数量(操作一,pt),和需要移除猫的数量(操作二,mov),因为这两个可以合并成一个动作完成(操作三),两个值当中求取一个最小的(minn),这个就是合并成操作三,然后用这两个数的较大值减去较小值就是得到需要单独完成的次数(maxx-minn),两个相加就得到结果了(minn+maxx-minn)。

2.Solution

//https://codeforces.com/contest/1921/problem/B
//
//
#include<bits/stdc++.h>
#define int long long
using namespace std;

void solve()
{
	int n;
	cin>>n;
	string s,f;
	cin>>s>>f;
	int mov=0,pt=0;
	for(int i=0;i<n;i++)
	{
		if(s[i]=='1'&&f[i]=='0')
		{
			mov++;
		}
		else if(s[i]=='0'&&f[i]=='1')
		{
			pt++;
		}
	}
	int minn=min(mov,pt);
	int maxx=max(mov,pt);
	int ans=minn+maxx-minn;
	cout<<ans<<"\n";
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

C. Sending Messages

👉传送门👈
在这里插入图片描述

1.Tutorial

每次可以选择两种操作:

  • 操作一:不黑屏,一直亮屏到下一次发消息(x*a)(x表示经过的时间,a表示单位时间失去的电量)
  • 操作二:黑屏,到下一次发消息再亮屏(b)(b表示操作二需要花费的电量)

只需要每次发消息前比较一下哪种情况消耗的电量少,最后判断一下电量是否大于0即可

2.Solution

//https://codeforces.com/contest/1921/problem/C
//
//
#include<bits/stdc++.h>
#define int long long
using namespace std;

int s[200020];
int v[200020];
void solve()
{
	int n,f,a,b;
	cin>>n>>f>>a>>b;
	s[0]=0;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
	}
	for(int i=0;i<n;i++)
	{
		v[i]=s[i+1]-s[i];
		if(v[i]*a<b)
		{
			f-=(v[i]*a);
		}
		else
		{
			f-=b;
		}
	}
	if(f>0) cout<<"YES\n";
	else cout<<"NO\n";
	
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}


3.Conclusion

这种题目很容易想复杂,建议先以简单的情况写,发现结果不对再改,不然很浪费时间


D. Very Different Array

👉传送门👈
在这里插入图片描述

1.Tutorial

贪心
每次肯定是选差值最大的,差值最大会在两种情况下产生:

  • a数组中最大的 - b数组中最小的
  • b数组中最大的 - a数组中最小的

所以只需要比较这两个值,取最大值即可

具体操作就是先将两个数组排序,因为是直接判断,顺序对结果没有影响,然后将排好序的数组分别尾插到双端队列中(方便尾删和头删),然后遍历判断即可

2.Solution

//https://codeforces.com/contest/1921/problem/D
//
//
#include<bits/stdc++.h>
#define int long long
using namespace std;

int a[200020];
int b[200020];
deque<int>s;
deque<int>v;
int ans=0;
int k=0;
int m,n;

void solve()
{
	s.clear();
	v.clear();
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<m;i++)
	{
		cin>>b[i];
	}
	sort(a,a+n);
	sort(b,b+m);
	for(int i=0;i<n;i++)
	{
		s.push_back(a[i]);
	}
	for(int i=0;i<m;i++)
	{
		v.push_back(b[i]);
	}
	ans=0;
	for(k=0;k<n;k++)
	{
		if(abs(s.back()-v.front())>abs(v.back()-s.front()))
		{
			ans+=(abs(s.back()-v.front()));
			s.pop_back();
			v.pop_front();
		}
		else
		{
			ans+=(abs(v.back()-s.front()));
			s.pop_front();
			v.pop_back();
		}
	}
	cout<<ans<<"\n";
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}


最后:

CF比赛记录系列旨在记录比赛过程,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。

之后每个星期都会不定期更新codeforces和atcoder上的题目,想要学习算法的友友们千万别错过了,有什么疑问欢迎大家在评论区留言或者私信博主!

在这里送大家一句话:广积粮,缓称王!

### 关于 Codeforces Round 1010 Div 2 的未评级题目与解答 Codeforces 平台上的比赛通常会提供详细的题目描述以及官方解法。然而,针对 Codeforces Round 1010 Div 2 的具体信息并未在当前引用中提及[^1]。值得注意的是,某些比赛可能会被标记为 unrated(未评级),这意味着该场比赛的结果不会影响参赛者的评分等级。 对于未评级的比赛问题及其解决方案,可以参考以下几点: #### 题目解析 尽管无法直接获取到 Codeforces Round 1010 Div 2 的具体内容,但可以通过类似的 CF 比赛来推测其可能涉及的主题。CF 圆桌会议中的常见主题包括但不限于字符串处理、数组操作、动态规划和图论等问题[^2]。 以下是基于一般竞赛模式下的假设性分析: 1. **字符串匹配问题** 字符串问题是许多编程比赛中常见的类型之一。例如,在某次比赛中曾出现过一个非常相似的问题:“Given a string S, find the minimum number of operations required to convert all characters into uppercase.” 这一类型的解决方法通常是通过遍历整个字符串并逐一比较字符实现。 ```python def min_operations_to_uppercase(s): count = 0 for char in s: if &#39;a&#39; <= char <= &#39;z&#39;: count += 1 return count ``` 2. **数组排序与统计** 数组类问题也频繁出现在各类算法挑战之中。比如给定一组整数列表,要求重新排列使得偶数位于奇数之前的同时保持相对顺序不变。这类问题可通过双指针技术或者额外空间辅助完成。 3. **动态规划应用** 动态规划适用于求解最优化路径或最大子序列等相关场景。如果存在一道 DP 类型的题目,则需定义状态转移方程并通过迭代计算得出最终结果。 #### 解决方案总结 由于缺乏确切的目标赛事数据集,上述仅为通用策略展示而非特定实例解答。建议访问 Codeforces 官网查询历史存档资料以获得权威版本说明文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PH_modest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值