floor的使用是否会导致误差(玄关)
  • 板块学术版
  • 楼主_anll_
  • 当前回复36
  • 已保存回复38
  • 发布时间2024/5/13 21:05
  • 上次更新2024/5/14 08:42:15
查看原帖
floor的使用是否会导致误差(玄关)
556545
_anll_楼主2024/5/13 21:05

rt,今天啃 上周六的 abc 的f题 WA 了 8 个点一直整不过,后来把 floor 函数删除直接除之后就过了。两版代码有且仅有向下取整的方式不同,对拍了十五万组数据还没找到问题所在。所以特此发帖想问问各位大佬 floor 为什么不能在此使用。

题目链接

两份代码的区别:

原版:

xs=floor(1.0*sx/k),ys=floor(1.0*sy/k);
xe=floor(1.0*ex/k),ye=floor(1.0*ey/k);

通过版:

xs=sx/k,ys=sy/k,xe=ex/k,ye=ey/k;

完整代码:

第一版代码 提交记录:

#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; 
}

第二版代码 提交记录:

#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=sx/k,ys=sy/k,xe=ex/k,ye=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 21:05
加载中...