1073c Vasya and Robot
阿新 • • 發佈:2018-12-20
題目的大意大概是有一個機器人從(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; }