codeforces1455E Four Points

博客围绕Codeforces上的一道题目展开,最初采用4!套三分的方法,运行速度慢。后提出可三分一个长度再贪心找,也可直接贪心。还介绍了通过4!枚举点最终位置,根据x、y方向长度可选范围是否重合来计算差值的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://codeforces.com/contest/1455/problem/E

一开始写了个4!套三分套三分套三分,然而跑得巨慢
其实可以只三分一个长度然后贪心找,然而不会推
其实还可以直接贪心就没了

先4!枚举一下每个点最终到达的位置

1 2

3 4

也就是12,34 y坐标要一样 13,24 x坐标要一样,首先我们考虑最终的端点都在他们之间的情况,也就是x方向的长度和y方向的长度的可选范围有重合的情况,那么就是他们之间的差值直接加起来就行了

如果没有,那么就说明需要有一对点一起走,直到有重合位置,那么就是再加上(大的-小的)*2就行了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=3e5+10;

int n,m,k,cnt,tot,cas;ll ans;
struct node
{
	ll x,y;
}a[10],c[10];
int b[10];
bool vis[maxl];
char s[maxl];

inline void prework()
{
	for(int i=1;i<=4;i++)
		scanf("%lld%lld",&c[i].x,&c[i].y),b[i]=i;
}

inline void mainwork()
{
	ans=1ll<<60;
	do
	{
		for(int i=1;i<=4;i++)
			a[i]=c[b[i]];
		ll tmp=0;
		ll lx=min(a[2].x,a[4].x)-max(a[1].x,a[3].x);
		ll rx=max(a[2].x,a[4].x)-min(a[1].x,a[3].x);
		ll ly=min(a[1].y,a[2].y)-max(a[3].y,a[4].y);
		ll ry=max(a[1].y,a[2].y)-min(a[3].y,a[4].y);
		tmp+=abs(a[1].x-a[3].x)+abs(a[2].x-a[4].x);
		tmp+=abs(a[1].y-a[2].y)+abs(a[3].y-a[4].y);
		if(lx>ry)
			tmp+=(lx-ry)*2;
		else if(ly>rx)
			tmp+=(ly-rx)*2;
		ans=min(tmp,ans);
	}while(next_permutation(b+1,b+1+4));
}

inline void print()
{
	printf("%lld\n",ans);
}

int main()
{
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

### CodeForces Problem 1455B 解决方案 对于编号为1455B的题目,该问题的核心在于理解给定输入与输出之间的映射关系。通过分析测试案例可以发现规律并构建解决方案[^1]。 #### 输入描述 程序接收整数`n`作为唯一参数,并返回特定变换后的结果。为了实现这一目标,需考虑如何处理不同范围内的数值转换逻辑。 #### 关键洞察 经过仔细观察样例数据可知,当输入值位于某些特殊区间内时会触发不同的计算路径。具体而言: - 对于较小的正整数(小于等于8),直接给出预定义的结果集中的对应项; - 超过上述界限之后,则采用一种基于位运算的操作来决定最终答案; 这种设计使得常规猜测变得困难,因为许多直观假设均不成立[^2]。 #### Python 实现代码 下面提供了一种可能的Python版本解答方式: ```python def solve(n): mapping = [0, 1, 1, 2, 1, 3, 1, 3, 2, 4] if n < len(mapping): return mapping[n] while n >= len(mapping): temp = [] current_length = len(mapping) for i in range(1, (current_length + 1)//2 + 1): temp.append(mapping[i]) last_value = mapping[-1] for value in reversed(temp[:-1]): last_value += value temp.append(last_value) mapping.extend(temp[current_length//2:]) n -= current_length return mapping[n] print(solve(int(input()))) ``` 此算法首先初始化了一个小型数组用于存储已知的小规模情况下的解法。随后进入循环结构,在每次迭代过程中动态扩展这个列表直到覆盖到所需的索引位置为止。最后输出所求得的答案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值