Educational Codeforces Round 60 (Rated for Div. 2), problem: (C) Magic Ship 二分法

本题分析可知每天风向加自主航行可保证船不远离目标。可以知道最大天数应为m*(x1+y1),如果这些天不能抵达目的地则为永远不能到达,可以将本题转化为二分法查找类问题,用二分法查找找到可以到达目的地坐标的最小的天数即可,算法复杂度为O(log(mx))。

ac代码:

#include 
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair 
#define ll long long 
#define INF 0x3f3f3f3f
#define MOD 1000000007 
using namespace std;
string s;
int d[100005][2];
int x,y;
ll x2,y2;
ll n; 
bool jd(ll a){
	ll t1=a/n;
	ll t2=a%n;
	ll px=abs(x2-x*t1-d[t2][0]);
	ll py=abs(y2-y*t1-d[t2][1]);
	return a>=(px+py);
	
}
int main()
{
    int x1,y1;
    cin>>x1>>y1>>x2>>y2>>n>>s;
    x2-=x1;
    y2-=y1;
    FOR(i,0,n){
		if(s[i]=='U'){
			d[i+1][0]=d[i][0];
			d[i+1][1]=d[i][1]+1;
		}
		else if(s[i]=='D'){
			d[i+1][0]=d[i][0];
			d[i+1][1]=d[i][1]-1;
		}
		else if(s[i]=='R'){
			d[i+1][1]=d[i][1];
			d[i+1][0]=d[i][0]+1;
		}
		else if(s[i]=='L'){
			d[i+1][1]=d[i][1];
			d[i+1][0]=d[i][0]-1;
		}
    }
    x=d[n][0];
    y=d[n][1];
    ll l=0;
	ll r=n*(abs(x2)+abs(y2));
    while(l<=r){
		ll m=(l+r)/2;
		if(jd(m)) r=m-1;
		else l=m+1;
    }
   	if(jd(l)) printf("%lld\n",l);
   	else printf("-1\n");
	return 0;
}



你可能感兴趣的:(codeforces,算法题,二分法,c++,算法题)