求助周六的abc F(玄关)
  • 板块学术版
  • 楼主_anll_
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/5/13 14:44
  • 上次更新2024/5/13 18:45:52
查看原帖
求助周六的abc F(玄关)
556545
_anll_楼主2024/5/13 14:44

rt,WA 了八个点,蒟蒻太菜实在看不出来哪里有问题了,求大佬捞捞QAQ

大体思路是先特判 k=1k=1 的情况,然后尽量跑大块,如果出生点在小块就对其进行偏移,再特判 k=2k=2 的情况。

提交记录

#include<iostream>
#include<cmath> 
#include<math.h>
#define int long long
using namespace std;
int k,sx,xs,sy,ys,ex,xe,ey,ye,go[5][2]={{0,0},{+1,0},{-1,0},{0,+1},{0,-1}},ans=1e18;
int Fun(int x1,int y1,int x2,int y2){
	int xx=abs(x1-x2),yy=abs(y1-y2);
	if(k==2) return 2*min(xx,yy)+abs(xx-yy)/2*3;
	return 2*max(abs(x1-x2),abs(y1-y2));
}
int F(int x,int y,int c){
	if(c==1) return k-(x%k);
	if(c==2) return x%k+1;
	if(c==3) return k-(y%k);
	if(c==4) return y%k+1;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>k>>sx>>sy>>ex>>ey;
	if(k==1){
		cout<<abs(sx-ex)+abs(sy-ey);
		return 0;
	}
	ans=abs(sx-ex)+abs(sy-ey);
	xs=floor(1.0*sx/k),ys=floor(1.0*sy/k);
	xe=floor(1.0*ex/k),ye=floor(1.0*ey/k);
	int st1=((xs+ys)&1)^1,st2=((xe+ye)&1)^1;//是否需要偏移到大块上 
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			ans=min(ans,Fun(xs+st1*go[i][0],ys+st1*go[i][1],
							xe+st2*go[j][0],ye+st2*go[j][1])
						+st1*F(sx,sy,i)+st2*F(ex,ey,j));
		}
	}
	cout<<ans;
	return 0; 
}
2024/5/13 14:44
加载中...