为什么我提前定义一个值 inf=RAND_MAX,然后之后使用 inf 就会挂,但是直接使用 RAND_MAX 就可以过?
AC code:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
#include<math.h>
#define int long long
#define double long double
using namespace std;
int n,cnt;
double t=2000,sx,sy,ansx,ansy,sum=1e18;
const double t0=1e-14,delta=0.993;
const int inf=RAND_MAX;
struct node
{
int x,y,w;
}a[1010];
inline double f(register double x,register double y)
{
register double res=0;
for(register int i=1;i<=n;i++)
{
register double dx=x-a[i].x,dy=y-a[i].y;
res+=sqrt(dx*dx+dy*dy)*a[i].w;
}
// cout<<res<<"\n";
return res;
}
inline void cold()
{
t=2000;
register double x=ansx,y=ansy;
while(t>t0)
{
register double nx=x+1.0*((rand()<<1)-RAND_MAX)*t,ny=y+1.0*((rand()<<1)-RAND_MAX)*t;
register double now=f(nx,ny);
register double d=now-sum;
if(d<0)
{
x=nx,y=ny;
ansx=nx,ansy=ny,sum=now;
// cout<<x<<" "<<y<<endl;
}
else if(exp(-d/t)*inf>rand())
{
x=nx,y=ny;
}
t*=delta;
}
}
void solve()
{
ansx=(double)sx/n,ansy=(double)sy/n,sum=f(ansx,ansy);
while((double)clock()/CLOCKS_PER_SEC<=0.95)
// for(int i=1;i<=5;i++)
{
cold();
}
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
srand(19260817);
cin>>n;
for(register int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].w;
sx+=a[i].x,sy+=a[i].y;
}
solve();
printf("%.3Lf %.3Lf\n",ansx,ansy);
return 0;
}
11pts WA code:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
#include<math.h>
#define int long long
#define double long double
using namespace std;
int n,cnt;
double t=2000,sx,sy,ansx,ansy,sum=1e18;
const double t0=1e-14,delta=0.993;
const int inf=RAND_MAX;
struct node
{
int x,y,w;
}a[1010];
inline double f(register double x,register double y)
{
register double res=0;
for(register int i=1;i<=n;i++)
{
register double dx=x-a[i].x,dy=y-a[i].y;
res+=sqrt(dx*dx+dy*dy)*a[i].w;
}
// cout<<res<<"\n";
return res;
}
inline void cold()
{
t=2000;
register double x=ansx,y=ansy;
while(t>t0)
{
register double nx=x+1.0*((rand()<<1)-inf)*t,ny=y+1.0*((rand()<<1)-inf)*t;
register double now=f(nx,ny);
register double d=now-sum;
if(d<0)
{
x=nx,y=ny;
ansx=nx,ansy=ny,sum=now;
// cout<<x<<" "<<y<<endl;
}
else if(exp(-d/t)*inf>rand())
{
x=nx,y=ny;
}
t*=delta;
}
}
void solve()
{
ansx=(double)sx/n,ansy=(double)sy/n,sum=f(ansx,ansy);
while((double)clock()/CLOCKS_PER_SEC<=0.95)
// for(int i=1;i<=5;i++)
{
cold();
}
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
srand(19260817);
cin>>n;
for(register int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].w;
sx+=a[i].x,sy+=a[i].y;
}
solve();
printf("%.3Lf %.3Lf\n",ansx,ansy);
return 0;
}
区别仅有 cold() 函数中定义 nx,ny 那一行。