社区讨论

floor的使用是否会导致误差(玄关)

学术版参与者 8已保存回复 38

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
36 条
当前快照
1 份
快照标识符
@lw4zbero
此快照首次捕获于
2024/05/13 21:07
2 年前
此快照最后确认于
2024/05/14 08:42
2 年前
查看原帖
rt,今天啃 上周六的 abc 的f题 WA 了 8 个点一直整不过,后来把 floor 函数删除直接除之后就过了。两版代码有且仅有向下取整的方式不同,对拍了十五万组数据还没找到问题所在。所以特此发帖想问问各位大佬 floor 为什么不能在此使用。
两份代码的区别:
原版:
CPP
xs=floor(1.0*sx/k),ys=floor(1.0*sy/k);
xe=floor(1.0*ex/k),ye=floor(1.0*ey/k);
通过版:
CPP
xs=sx/k,ys=sy/k,xe=ex/k,ye=ey/k;
完整代码:
第一版代码 提交记录
CPP
#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; 
}
第二版代码 提交记录
CPP
#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; 
}

回复

38 条回复,欢迎继续交流。

正在加载回复...