ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC135E Golf 题解

2022-07-05 09:02:01  阅读:140  来源: 互联网

标签:std nx Golf 题解 times 偶数 using include ABC135E


一道还行的构造题。
题目大意:一开始你在初始点 \((0,0)\),每次可以跳的曼哈顿距离为 \(k\),输出抵达 \((x,y)\) 跳的最少次数并且输出方案。
首先发现 \(x\) 和 \(y\) 可正可负,不如把 \(x\) 和 \(y\) 都取绝对值,在之后输出时携带符号输出即可。
因为每次的操作相当于把 \(k\) 瓜分成 \(x\) 和 \(y\)。先考虑如果 \(k\) 是奇数那么只能拆成奇数和偶数,可以通过调控 \(k\) 的数量来构造答案。如果 \(k\) 是偶数 \(x+y\) 是偶数,只要把 \(k\) 拆成两个偶数或者奇数也是能做到的。只有 \(k\) 是偶数并且 \(x+y\) 是奇数时无解。
设答案为 \(n\),在 \(x\) 轴和 \(y\) 轴上的正向移动距离为 \(a\),反向移动距离为 \(b\),那么 \(x+y\le n\times k\) 且 \((n\times k-x-y)\mod2=0\),这个不好解,但是 \(x\) 和 \(y\) 值域不大所以直接枚举 \(n\) 的值就行。\(a+b=n\times k\),\(a-b=x+y\) 解出 \(a=\dfrac{n\times k+x+y}2\),\(b=\dfrac{n\times k-x-y}2\)。
那就直接考虑在前进时的 \(3\) 个情况即可:(这里的 \(b\) 会随着逆向移动的距离而减小)

  • \(b\gt k\),选择 \(x\) 和 \(y\) 里当前位置距离最终位置比较近的一个,逆向移动 \(k\)。
  • \(b\leq k\),选择 \(x\) 和 \(y\) 里当前位置距离最终位置比较近的一个,逆向移动 \(b\),另一个移动 \(k-b\)。
  • \(b=0\),任意把 \(x\) 和 \(y\) 推进,最艰难的时候过去了,可以随便放保证了。

放个代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#define siz(x) int((x).size())
#define cauto const auto
#define all(x) x.begin(),x.end()
using std::cin;using std::cout;
using loli=long long;
using venti=__int128_t;
using pii=std::pair<int,int>;
int n=2,k,x,y;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);cin.tie(nullptr);
	cin>>k>>x>>y;
	int opx=x/abs(x),opy=y/abs(y);x*=opx,y*=opy;
	if(x+y==k)return cout<<"1\n"<<x*opx<<' '<<y*opy,0;
	if(k%2==0&&(x+y)%2==1)return cout<<"-1",0;
	for(;n*k<x+y||(n*k-x-y)%2;)n++;
	cout<<n<<'\n';
	int b=(n*k-x-y)/2;
	for(int nx=0,ny=0;n--;cout<<nx*opx<<' '<<ny*opy<<'\n')
		if(b){
			if(b>=k){if(x-nx<y-ny)nx-=k;else ny-=k;b-=k;}
			else{if(x-nx<y-ny)nx-=b,ny+=k-b;else ny-=b,nx+=k-b;b=0;}
		}else{if(nx<x){if(x-nx>=k)nx+=k;else ny+=k-x+nx,nx=x;}else ny+=k;}
	return 0;
}

标签:std,nx,Golf,题解,times,偶数,using,include,ABC135E
来源: https://www.cnblogs.com/bxjz/p/ABC135E.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有