CF - 1073c Vasya and Robot

15 篇文章 0 订阅

题目的大意大概是有一个机器人从(0,0)出发,根据给定的方向行走,然后给定一个坐标,让你改变最小的步数来使得机器人走到那里,如果无法到达输出-1.

思路:

先按原来的序列计算x,y的前缀和,然后二分,找出需要改变的最短区间长度,枚举所有的长度为m的区间,然后判断区间是否符合条件,若符合就进行二分,条件为改变区间的贡献值小于区间长度且剩余的个数为偶数个。代码如下:

#include<iostream>
#include<string>
#include<algorithm>
#define maxn 1000000

using namespace std;

char a[maxn];
int ax[maxn], ay[maxn];

int main()
{
	int n, x, y;
	cin>>n;
	for(int i=1; i<=n; ++i)
		cin>>a[i];
	cin>>x>>y;
	ax[0] = 0;
	ay[0] = 0;
	for(int i=1; i<=n; i++)
	{
		ax[i] = ax[i - 1] + (a[i] == 'L' ? -1 : (a[i] == 'R' ? 1 : 0));
		ay[i] = ay[i - 1] + (a[i] == 'D' ? -1 : (a[i] == 'U' ? 1 : 0));
	}
	int l=0, r=n, ans=-1;
	while(l<=r)
	{
		int mid = (l+r)/2;
		int flag = false;
		for(int i=1; i+mid-1<=n; ++i)
		{
			int xx = ax[n]-ax[i+mid-1]+ax[i-1];
			int yy = ay[n]-ay[i+mid-1]+ay[i-1];
			int tx = x- xx;
			int ty = y -yy;
			if(abs(tx)+abs(ty)<=mid && (mid-abs(tx)-abs(ty))%2==0)
			{
				ans = mid;
				r = mid - 1;
				flag = true;
				break;
			}
		}
		if(!flag)
			l=mid+1;
	}
	if(ans == -1)
		cout<<"-1"<<endl;
	else
		cout<<ans<<endl;

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值