社区讨论
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 为什么不能在此使用。
两份代码的区别:
原版:
CPPxs=floor(1.0*sx/k),ys=floor(1.0*sy/k);
xe=floor(1.0*ex/k),ye=floor(1.0*ey/k);
通过版:
CPPxs=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 条回复,欢迎继续交流。
正在加载回复...