C. Magic Ship(普通二分)

1900 . . . . . . . . 做过的最水的一道1900分........

, 很明显二分答案,因为有单调性

x , . 如果在x天满足,往后也一定满足.

x 因为大于x天只需要一直和风向走相反的方向就可以一直停在目的地

u d [ ] l r [ ] , 所以用ud[]和lr[]数组记录风向的前驱,算出风的总走向

具体看代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define int long long
int x,y,nx,ny,n;
int ud[maxn],lr[maxn];
bool isok(int mid)
{
	int ci=mid/n;
	int re=mid%n;
	int sx=ci*lr[n]+lr[re];
	int sy=ci*ud[n]+ud[re];
	int q=x+sx,w=y+sy;
	if( abs(q-nx)+abs(w-ny)<=mid )	return true;
	else	return false;
} 
signed main()
{
	cin >> x >> y >> nx >> ny;
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		char s;
		cin >> s;
		ud[i]=ud[i-1];
		lr[i]=lr[i-1];
		if(s=='U')	ud[i]++;
		else if(s=='D')	ud[i]--;
		else if(s=='L')	lr[i]--;
		else	lr[i]++;		
	}
	int l=1,r=1e18,mid,ans=-1;
	while(r>=l)
	{
		mid=l+r>>1;
		if( isok(mid) )	r=mid-1,ans=mid;
		else	l=mid+1;
	}
	cout << ans;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106834215