1. 程式人生 > >1073c Vasya and Robot

1073c Vasya and Robot

題目的大意大概是有一個機器人從(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;
}