hdu 2073:无限的路(思维)
开始想着用个前缀,然后后面直接调用即可,但是由于实力有限,没能搞出来,后面就想着干脆暴力模拟,结果交一发TLE。。。。。
于是就开始看大佬们的博客了
https://blog.csdn.net/yangyafeiac/article/details/7828435
居然又是一道思维题,感觉还是比较难想到,其实我觉得前缀其实可以的,但是就是没弄出来
有点迷…
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
double fx(int x,int y){
double ans=0.0;
double m=sqrt(2.0);
int n=x+y;
for(int i=1;i<n;i++){
ans+=i*m*1.0;
}
ans+=x*m; //这里重点注意
for(int i=0;i<n;i++)
ans+=sqrt(i*i*1.0+(i+1)*(i+1)*1.0);
return ans;
}
int main(){
int t;
int x1,y1,x2,y2;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%.3f\n",fabs(fx(x1,y1)-fx(x2,y2)));
}
return 0;
}
TLE代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int main(){
int k;
int x1,y1,x2,y2;
scanf("%d",&k);
while(k--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if((x1+y1)>=(x2+y2)){
int t=x1;
x1=x2;
x2=t;
t=y1;
y1=y2;
y2=t;
}
int i=x1,j=y1;
double sum=0.0;
while(!(i==x2&&j==y2)){
if(i==0&&j==0){
sum+=1.0;
j++;
}
else if(j==0){
sum+=sqrt(i*i*1.0+(i+1)*(i+1)*1.0);
j=i+1;
i=0;
}
else{
sum+=sqrt(2.0);
i++;
j--;
}
}
printf("%.3f\n",sum);
}
return 0;
}